python - 将 django 页面共享给没有帐户的用户

标签 python django

我正在尝试在我的需要注册的网站中实现共享。我希望用户能够在特定时间段(1 天、1 周等)内共享页面,以便任何拥有特殊链接的人都可以访问该页面。这在 Django 中可能吗?

编辑:我的解决方案(基于 Saurabh Goyal’s answer ):

  1. 向您的 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 )。

  2. 在您的 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
    

    这个装饰器允许 View 需要登录,除非页面是共享的。

  3. 装饰您希望与 @allow_shares 共享的任何 View 。
  4. 添加一个新的 Exception 子类,SharifyError,如下所示:

    class SharifyError(Exception):pass
    
  5. 同样在 views.py 中,添加一个 View 来解析共享的 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.
    
  6. 将 url 添加到 urls.py,如下所示:

    urlpatterns = patterns('',
        # ...
        url(r'^access/(?P<key>\w+)$', views.sharedPage, name="sharedPage"),
        # ...
    )
    
  7. 最后,添加 URL 以创建共享链接,并像这样实现 View :

    # 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 %}

这将要求用户登录才能查看装饰页面,除非他们输入了 key 。

最佳答案

是的,您可以通过添加一个以 dB 为单位的附加字段来实现这一点,该字段将表示页面可被所有人访问之前的最后日期时间。然后每当有人访问它时,只需检查当前日期时间是否早于或等于该字段的值,如果是,则允许他们访问,如果不是,则拒绝访问。

当用户请求使页面可访问时,创建特殊链接并相应地更新字段。

确保为您在每个请求中生成的特殊链接处理路由。

编辑-

要使用键来处理事情,您可以采取以下步骤-

1) 每当用户请求特殊链接时生成一个随 secret 钥,

2) 将访问页面的key和对应的最新日期时间存入db

3) 假设您页面的主 url 是“/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'),
)

你添加另一个 url,像这样-

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/' 也将重定向到您的页面 View 。

4) 在您的 View 中,访问 key ,从 dB 获取该 key 的最新访问日期时间,如果有效,则授予访问权限,否则拒绝访问。

关于python - 将 django 页面共享给没有帐户的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32255458/

相关文章:

javascript - 如何访问 Django 模板中的外键? (列表显示)

python - Django:通过 send_mass_mail() 发送 HTML 电子邮件

python - NGINX 在 Dockered Django 项目中找不到静态文件

python - 通过 Google Drive API 访问共享云端硬盘时出现 404 错误

python - 针对最长公共(public)子序列问题的输入大小绘制时间

python - 使用 mock.patch 和 mock_open 模拟包含 JSON 数据的文件

python - Keras 中的深度自动编码器将一个维度转换为另一个维度

python - Django 与 CDN 无缝升级

django - 使用 django 测试客户端发送 JSON

python 3 : Split string under certain condition