#1 方法
我们正在这里尝试生成令牌。根据定义,令牌是随机生成的字符序列。从其余身份验证令牌模型中汲取灵感,我们可以有一个类似的自定义模型。我们将覆盖此模型的保存方法以生成密钥。
import binascii
import os
from django.db import models
from django.utils.translation import ugettext_lazy as _
class NonBuiltInUserToken(models.Model):
...
key: str = models.CharField(_("Key"), max_length=40, primary_key=True)
user: User = models.OneToOneField(
User, related_name='auth_token',
on_delete=models.CASCADE,
verbose_name=_("User")
)
created = models.DateTimeField(_("Created"), auto_now_add=True)
...
class Meta:
verbose_name = _("Token")
verbose_name_plural = _("Tokens")
def save(self, *args, **kwargs):
if not self.key:
self.key = self.generate_key()
return super(NonBuiltInUserToken, self).save(*args, **kwargs)
def generate_key(self):
return binascii.hexlify(os.urandom(20)).decode()
def __str__(self):
return self.key
复制自this stack overflow answer
#2 方法
您也可以尝试将身份验证令牌的令牌模型子类化。
...
from django.db import models
from django.utils.translation import gettext_lazy as _
from rest_framework.auth_token.models import Token
...
class NonBuiltInUserToken(Token):
"""
Overrides the Token model to use the
non-built-in user model
"""
user = models.OneToOneField(
User, related_name='auth_token',
on_delete=models.CASCADE,
verbose_name=_("User")
)
如果我们检查rest_framework.authtoken.models 中的Token 模型,如果rest_framework.authtoken 不存在于settings.INSTALLED_APPS 中,我们将看到Token 类是抽象的。
class Meta:
# Work around for a bug in Django:
# https://code.djangoproject.com/ticket/19422
#
# Also see corresponding ticket:
# https://github.com/encode/django-rest-framework/issues/705
abstract = 'rest_framework.authtoken' not in settings.INSTALLED_APPS
因此,为了使用此令牌模型,您需要从 settings.INSTALLED_APPS 中删除 rest_framework.authtoken
现在,您在用户模型中有一个新的非构建令牌模型。您将在信号中使用此模型来创建令牌。