首页 > 解决方案 > 如何通过 django-rest-api 用户创建允许空白密码

问题描述

就我而言,我需要一个用户组,在创建用户时不会设置电子邮件和密码。他们也不需要对自己进行身份验证。

我设法使用可为空的电子邮件来自定义用户,但我找不到在 API 调用或 Django 管理表单中允许空白密码的方法。我不太关心表单,但我需要让它通过 API 工作。

我怎么能允许使用空白密码创建一个新的自定义用户,并且如果它是空白的(如 set_unusable_password()),可能会将其设置为有意义的东西?

谢谢!

我的CustomUserManager

from django.contrib.auth.base_user import BaseUserManager
from django.utils.translation import ugettext_lazy as _


class CustomUserManager(BaseUserManager):
    def create_user(self, email, password, **extra_fields):

        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        # if password == "":
        #     user.set_password(None)
        # else:
        user.set_password(password)
        user.save()
        return user

    def create_superuser(...

标签: djangodjango-rest-frameworkpasswordsdjango-rest-authdjango-custom-user

解决方案


您可以基于您的 CustomUserAbstractUser并使用set_password

from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
...

多亏了这一点,您可以访问该功能set_password。任何基于 CustomUser 的用户都将继承:

def set_password(self, raw_password):
    self.password = make_password(raw_password)
    self._password = raw_password

如果你仔细观察make_password,你会意识到可以给它None

 if password is None:
    return UNUSABLE_PASSWORD_PREFIX + get_random_string(UNUSABLE_PASSWORD_SUFFIX_LENGTH)

您可以查看 Django 上的完整示例,以获得一个起点Manager

您的模型将如下所示:

class MyUser(AbstractBaseUser):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )
    date_of_birth = models.DateField()
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = MyUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['date_of_birth']

上传经理后更新:

class CustomUserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):

        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save()
        return user

    def create_superuser(...

您忘记了password=None您的 create_user。这就是您需要此错误的原因。


推荐阅读