Python 如何在Django中创建仅包含用户名的用户模型?

Python 如何在Django中创建仅包含用户名的用户模型?,python,django,rest,authentication,django-rest-framework,Python,Django,Rest,Authentication,Django Rest Framework,嗯,这有点复杂,但让我自己解释一下。我想创建一个RESTful服务。此服务将包含用户,但不是以传统方式 我想基于随机散列创建用户,我将使用uuid来实现这一点。最重要的是我不需要用户名,密码,电子邮件或全名(?)。这种类型的用户将通过视图上的GET参数进行身份验证,只使用其用户名,而不使用其他任何东西 我读了一些关于扩展Django用户的文章,但我找不到令人满意的解释,尤其是关于这个案例 进一步解释 现在,我可以听到这样的问题:“为什么有人会特别需要无密码用户模型,特别是认为它是非常不安全的。”

嗯,这有点复杂,但让我自己解释一下。我想创建一个RESTful服务。此服务将包含用户,但不是以传统方式

我想基于随机散列创建用户,我将使用
uuid
来实现这一点。最重要的是我不需要
用户名
密码
电子邮件
全名
(?)。这种类型的用户将通过视图上的GET参数进行身份验证,只使用其
用户名
,而不使用其他任何东西

我读了一些关于扩展Django用户的文章,但我找不到令人满意的解释,尤其是关于这个案例

进一步解释 现在,我可以听到这样的问题:“为什么有人会特别需要无密码用户模型,特别是认为它是非常不安全的。”。所以,这一部分特别适合那些需要逻辑解释才能理解这样一个请求的人

在服务中,我希望有三组用户:

  • 匿名用户
    :确实在服务器上请求某些数据的用户
  • uuid用户
    :具有唯一id的用户。我为什么需要这种类型?因为我想跟踪那些用户的请求并为他们响应特殊数据。如果这些类型的用户在特定的几天内处于非活动状态,也将被删除。我想我可以通过cron jobs做到这一点
  • admin
    :这是我,正在进入管理面板。仅此而已
  • 我想这就足够了


    环境
    • django 1.9.5
    • python 3.5.1

    Django支持多个后端身份验证。正如Luis Masuelli所建议的,您可以扩展模型以添加更多字段。但在您的场景中,您特别希望实现一种自定义身份验证方法。我会把uuid当作用户名,把密码设为无

    因此,在my settings.py中:

     AUTH_USER_MODEL = 'app_name.MyUUIDModel'
     # REMOVE ALL PASSWORD Validators
    
    在我的应用程序_name/models.py中:

    from django.contrib.auth.models import BaseUserManager
    
    class MyUUIDManager(BaseUserManager):
    
    def create_user(self, uuid):
        user = self.model(
            uuid=self.normalize_email(email),
        )
        user.set_password(None)
        user.save(using=self._db)
        return user
    
    def create_superuser(self, uuid):
        user = self.create_user(uuid)
        user.save(using=self._db)
        return user
    
    def get_by_natural_key(self, email):
        return self.get(**{self.model.USERNAME_FIELD: email})   
    
     class MyUUIDModel(AbstractBaseUser):
           uuid = models.CharField(max_length=36, unique=True)
           USERNAME_FIELD = 'uuid'
           objects = UUIDModelManager()
           def save(self, *args, **kwargs):
               super(MyUUIDModel, self).save(*args, **kwargs)
    
    此时,如果运行createuser或createsuperuser Django命令,则可以创建用户。下一位是需要进行身份验证的位置。您只需检查数据库中是否存在UUID,并在从视图调用authenticate()时返回true

    在settings.py文件中添加身份验证后端:

    AUTHENTICATION_BACKENDS = [
      'django.contrib.auth.backends.ModelBackend',
      'app_name.auth.MyBackend'
    ]
    
    创建一个文件app_name/auth.py,其内容如下:

    class MyBackend(object):
        def authenticate(self, username=None, password=None):
    
            # Check if username i.e. UUID exists
            try:
                my_uuid = MyUUIDModel.objects.get(uuid=username)
            except MyUUIDModel.DoesNotExist:
                return None
            return my_uuid
    

    更多详细信息请参阅:

    不能为较少的字段扩展模型。模型继承是增量的,您只能从头开始创建较小的模型。阅读文档和源代码,以获取有关如何根据需要实现用户模型以及不同身份验证后端的帮助。好的,我将此作为一个信息,但这并不能解决问题。所以,以防万一,我不会删除这个问题,并等待解决方案。一定有办法做到这一点,对吗?他们会像我说的那样回答:数据库中的字段不能少。Django为像您和我这样的人提供了一个
    AbstractBaseUser
    类。你不是第一个要求更少用户模型的人。将AbstractBaseUser作为。。。或者按照django指南从头开始创建模型。此外,您还需要为您试图实现的目标创建自定义身份验证后端。