簡體   English   中英

將django頁面共享給沒有帳戶的用戶

[英]Share django page to user who does not have an account

我正在嘗試在我需要注冊的網站上實現共享。 我希望用戶能夠在一定的時間段內(1天,1周等)共享頁面,以便具有特殊鏈接的任何人都可以訪問該頁面。 在Django中有可能嗎?

編輯:我的解決方案(基於Saurabh Goyal的回答 ):

  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 

    除非共享頁面,否則此裝飾器允許視圖要求登錄。

  3. 裝飾您希望與@allow_shares共享的任何視圖。
  4. 添加一個新的Exception子類SharifyError ,如下所示:

     class SharifyError(Exception):pass 
  5. 同樣在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. 
  6. 將網址添加到urls.py ,如下所示:

     urlpatterns = patterns('', # ... url(r'^access/(?P<key>\\w+)$', views.sharedPage, name="sharedPage"), # ... ) 
  7. 最后,添加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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM