python - 如何同时使用 Django Auth 和 DRF Token auth?
问题描述
我正在构建一个 Django Web 应用程序,我想要两件事:
- 使用 Django 的内置用户模型来使用 Django 的管理应用程序(店主)
- 在我将命名为“客户”(商店客户)的自定义用户模型上使用 DRF 的令牌验证
我如何为上述目的保留两个身份验证系统。根据我的阅读,每个人都要求覆盖 User 模型,但我不想这样做。相反,我想保留两者。我应该采取什么策略?
PS:可能是我,但我无法在 DRF 的文档中找到任何解决方案。如果有,请指出我正确的方向。
解决方案
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...
推荐阅读
- android - android:动态创建视图并稍后访问它们
- c# - 在更改日志之前获取实体
- python - 从字符串中提取字符并在 Python 中形成新列
- python - 如何使用 numpy 将多个数据分别保存在单个输出文件中
- ruby-on-rails - 如果从辅助方法 rails 更改,则不会显示 I18n 转换的值
- react-native - 视图换行到下一行时如何使用marginTop?
- anaconda - 错误 anaconda_api.is_vscode_available:956
- postman - postman.setNextRequest() 中的目标请求无法设置环境变量
- autoconf - 为 r 包编写 `configure` 文件
- java - 多个分隔符,并希望使用正则表达式将其中一个分隔符包含在字符串中