我为大学创建了一个Django应用程序(“监考管理系统”)。我没有包含任何登录授权,因为它只会被大学管理员使用。在这个应用程序中,我还剩下一个任务,我必须在邮件中发送可用性表单给所有数据库中的用户,要求他们填写表单是否可用于当天,根据他们的响应我必须存储他们在数据库中的可用性我如何通过邮件发送表格?或者我应该向他们发送表格的链接?如果我必须发送链接,如何通过更改他们获得的链接来阻止一个用户访问其他用户的表单,任何想法如何添加令牌以及他们唯一的ID?
使用唯一令牌发送电子邮件
生成令牌:
使用用户的字段作为salt生成随机令牌。可以是任何一个或多个字段,如名字,姓氏,用户ID等。似乎您没有大的用户群,并且重复令牌的可能性较小。
如何生成令牌?
有很多包可以帮助您生成随机令牌。根据我的经验,我发现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'),
]
我猜你得到了主旨。