社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

如何在django中发送带有用户唯一id和令牌的url?

rabindra regmi • 6 年前 • 1549 次点击  

我为大学创建了一个django应用程序(“监考管理系统”)。我没有包括任何登录授权,因为它将只用于大学管理员。在这个应用程序中,我只剩下一个任务,我必须为数据库中的所有用户发送邮件可用性表单,要求他们填写当天是否可用的表单,根据他们的响应,我必须将他们的可用性状态存储在数据库中。我怎样邮寄表格? 或者我应该给他们发一个表格的链接吗? 如果我必须发送链接,我如何才能阻止一个用户访问另一个用户的表单,只需更改他们获得的链接,知道如何添加令牌以及他们的唯一ID?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43048
 
1549 次点击  
文章 [ 1 ]  |  最新文章 6 年前
Debendra
Reply   •   1 楼
Debendra    6 年前

发送带有唯一令牌的电子邮件。

生成令牌:

使用用户字段作为salt生成随机令牌。 可以是一个或多个字段,如名字、姓氏、用户名等。 似乎你没有大的用户群,而且复制令牌的可能性较小。

如何生成令牌?

有许多包可以帮助您生成随机令牌。 根据我的经验 uuid , secrets , hashlib 当然,这些是python内置的库。

例子:

>>> import uuid
>>> print(uuid.uuid4().hex)
'772d4c80-3668-4980-a014-aae59e34b9b9'

>>> import secrets
>>> secrets.token_hex(8)
'15653f73b28182f2'

# random token and user's field combination as salt
import uuid, hashlib
>>> first_name = user.first_name  # pull user from database
>>> salt = uuid.uuid4().hex + first_name
>>> hashlib.sha256(salt.encode('utf-8')).hexdigest()
'effc7a5b0c42bcb53f196b3a6a49065c49ee2add53aa71db89a3d4b9f4fbebcb'

似乎生成随机令牌现在已完成。

现在将您的随机令牌分别存储在您的数据库中的用户,如果您想更确定令牌不存在于数据库中,请在存储到数据库之前检查它是否存在。

唯一令牌模型示例:

from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone

class UserUniqueToken(models.Model):
    user_id = models.ForeignKey(User, on_delete=models.CASCADE)
    token = models.Charfieled(max_length=100)
    datetime = models.DateTime(default=timezone.now)  # for token expiration

如何检查令牌有效性?

很简单。

views.py :

from .models import UserUniqueToken
from django.shortcuts import get_object_or_404
from django.contrib.auth.decorators import login_required
from djano.utils import timezone
from datetime import timedelta

@login_required
def user_form(request, token):
    user_token = get_object_or_404(UserUniqueToken, token=token)  # get object or throw 404
    if not user_token.user_id == request.user.id:  # check token belongs to the user 
        # do something
    time_now = timezone.now()  # get current time
    if user_token.datetime > (time_now - timedelta(hours=2)):  # check if stored time exceeds 2 hours
          # do something with expired token
    return render(.............)

urls.py :

from .views import user_form

urlpatterns = [
        path('form/<string:token>', user_form, name='user-form'),
]

我想你明白要点了。