[英]Show a login page to a user who is not logged in without LoginRequiredMixin / django
[英]Share django page to user who does not have an account
我正在尝试在我需要注册的网站上实现共享。 我希望用户能够在一定的时间段内(1天,1周等)共享页面,以便具有特殊链接的任何人都可以访问该页面。 在Django中有可能吗?
编辑:我的解决方案(基于Saurabh Goyal的回答 ):
将新模型添加到您的models.py
,如下所示:
class ShareKey(models.Model): location = models.TextField() # absolute path token = models.CharField(max_length=40, primary_key=True) creation_date = models.DateTimeField(auto_now_add=True) expiration_seconds = models.BigIntegerField() data = PickledObjectField() # custom sharing data
( data
字段是可选的,并且需要django-picklefield )。
在您的views.py
,添加一个装饰器函数,如下所示:
def allow_shares(view_func): def sharify(request, *args, **kwargs): shared = kwargs.get('__shared', None) if shared is not None: if '__shared' not in view_func.func_code.co_varnames[:view_func.func_code.co_argcount]: del kwargs["__shared"] return view_func(request, *args, **kwargs) else: return login_required(view_func)(request, *args, **kwargs) return sharify
除非共享页面,否则此装饰器允许视图要求登录。
@allow_shares
共享的任何视图。 添加一个新的Exception子类SharifyError
,如下所示:
class SharifyError(Exception):pass
同样在views.py
,添加一个视图来解析共享的URL,如下所示:
def sharedPage(request, key): try: try: shareKey = ShareKey.objects.get(pk=key) except: raise SharifyError if shareKey.expired: raise SharifyError func, args, kwargs = resolve(shareKey.location) kwargs["__shared"] = True return func(request, *args, **kwargs) except SharifyError: raise Http404 # or add a more detailed error page. This either means that the key doesn't exist or is expired.
将网址添加到urls.py
,如下所示:
urlpatterns = patterns('', # ... url(r'^access/(?P<key>\\w+)$', views.sharedPage, name="sharedPage"), # ... )
最后,添加URL以创建共享链接,并实现如下视图:
# in imports from django.utils.crypto import get_random_string def createShare(request, model_id): task = MyModel.objects.get(pk=model_id) key = ShareKey.objects.create(pk=get_random_string(40), expiration_seconds=60*60*24, # 1 day location = task.get_absolute_url(), ) key.save() return render(request, 'share.html', {"key":key});
(您的share.html
模板应如下所示):
{% extends 'base.html' %}
{% block content %}
<h1>Sharing link created.</h1>
<p>The link is <a href="{{ base_url }}{% url 'taskShared' key.pk %}">{{ base_url }}{% url 'taskShared' key.pk %}</a>. It will be valid until {{ key.expiration_date|date:"l, N dS" }} at {{ key.expiration_date|time:"g:i a" }}.</p>
{% endblock %}
除非用户输入了密钥,否则这将要求用户登录才能查看修饰的页面。
是的,您可以简单地做到这一点,只需再增加一个以dB为单位的字段,它将代表直到所有人都可以访问页面为止的最后一个日期时间。 然后,只要有人访问它,只需检查当前日期时间是否早于或等于该字段的值,如果是,则让他们访问,如果否,则拒绝访问。
当用户请求使页面可访问时,请创建特殊链接并相应地更新该字段。
确保处理在每个请求上生成的特殊链接的路由。
要使用键处理事情,您可以采取以下步骤-
1)每当用户请求特殊链接时,都会生成一个随机密钥,
2)在数据库中存储页面的密钥和相应的最新访问日期时间
3)假设您网页的主要网址是“ / mypage /”,而您的urls.py如下所示-
from django.conf.urls import patterns, url
from apps.myapp import views as myapp_views
# See: https://docs.djangoproject.com/en/dev/topics/http/urls/
urlpatterns = patterns(
'',
url(r'^mypage/$', myapp_views.MyPageView.as_view(), name='mypage'),
)
您添加了另一个网址,如下所示:
from django.conf.urls import patterns, url
from apps.myapp import views as myapp_views
# See: https://docs.djangoproject.com/en/dev/topics/http/urls/
urlpatterns = patterns(
'',
url(r'^mypage/$', myapp_views.MyPageView.as_view(), name='mypage'),
url(r'^mypage/(?P<key>\w+)/$', myapp_views.MyPageView.as_view(), name='mypage_special'),
)
上面的结果是,URL'/ mypage / any_alphanumeric_key /'也将重定向到您的页面视图。
4)在您看来,访问密钥,从dB获取该密钥的最新访问日期时间,如果有效,则授予访问权限,否则拒绝访问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.