私信  •  关注

Debendra

Debendra 最近创建的主题
Debendra 最近回复了
7 年前
回复了 Debendra 创建的主题 » 如何在django中发送带有用户唯一id和令牌的url?

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

生成令牌:

使用用户字段作为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'),
]

我想你明白要点了。

7 年前
回复了 Debendra 创建的主题 » 在django数据库中插入foregin键

我在上面的注释中指定了,您有3个字段 forms.py 4个字段 models.py 你指定了所有 fields 在字段上使用 表单 .

变化 表单 .

class AddNetworkDevice(forms.ModelForm):
     vendor = forms.CharField(required=True, label='Proizvajalec', max_length=100)
     product = forms.CharField(required=True, label='Produkt', max_length=100)
     version = forms.CharField(required=False, label='Verzija', max_length=50)

    class Meta:
         model = NetworkDevices
         fields = ('vendor', 'product', 'version')  # here is your problem

也可以按排除字段 exclude = ('fields') 根据@Daniel Roseman的回答。