首页 > 解决方案 > 如何同时使用 Django Auth 和 DRF Token auth?

问题描述

我正在构建一个 Django Web 应用程序,我想要两件事:

我如何为上述目的保留两个身份验证系统。根据我的阅读,每个人都要求覆盖 User 模型,但我不想这样做。相反,我想保留两者。我应该采取什么策略?

PS:可能是我,但我无法在 DRF 的文档中找到任何解决方案。如果有,请指出我正确的方向。

标签: pythondjangoauthenticationdjango-rest-framework

解决方案


Django 确实提供了使用自定义用户模型的选项。但是您可以拥有一个且只有一个用户模型。

该过程相当简单,创建您自己的模型继承 django.contrib.auth.models.AbstractUser 并指定 AUTH_USER_MODEL 设置变量。Django 管理员与“自定义用户模型”概念配合得很好。DRF 令牌模型还为其 OneToOne 关系使用 settings.AUTH_USER_MODEL var。因此,这可能是一个可行的解决方案。

要分离用户类型,您可以使用带有表示用户类型的选项的 char 字段或使用现有的 Django 组机制。但是,在这两种情况下,您仍然只能拥有一个用户模型。

对于任何特定细节,您可以与存储额外信息的不同模型建立 OneToOne 关系。

这样的事情会做,

from django.contrib.auth.models import AbstractUser
from model_utils.choices import Choices   # Useful package
from django.utils.functional import cached_property


class User(AbstractUser):
    USER_TYPES = Choices(
        ("store_owner", "Store Owner"),
        ("customer", "Customer"),
    )
    ...hack...
    user_type = models.CharField(choices=USER_TYPES)
    ...hack...

    @cached_property
    def is_store_owner(self):
        return (
            self.user_type == self.USER_TYPES.store_owner 
            and self.store_owner is not None
        )

    @cached_property
    def is_customer(self):
        return (
            self.user_type == self.USER_TYPES.customer 
            and self.customer is not None
        )


class StoreOwner(models.Model):
    user = models.OneToOneField(
        "yourapp.User", 
        related_name="store_owner",
    )
    # ...extra store owner details...


class Customer(models.Model):
    user = models.OneToOneField(
        "userapp.User",
        related_name="customer",
    )
    # ...extra customer details...


推荐阅读