模块化的Django用户
项目描述
模块化的Django用户。
我不会讨论这是否是一个好主意。这个Django应用程序通过修补django来实现一个自定义的用户模型,该模型可以连接到 django.contrib.auth 应用程序。
安装
首先,通过检出最新代码或使用pip安装该模块
pip install django-primate
为了进行猴子补丁,我们需要这样做。我创建了一个小型的修改过的 manage.py 文件,您可以用于开发。这设置了您的环境,在您运行管理命令(例如 runserver)之前,我们应用补丁。将此复制到您的项目中,并覆盖默认的 manage.py
#!/usr/bin/env python from django.core.management import setup_environ, ManagementUtility import imp try: imp.find_module('settings') # Assumed to be in the same directory. except ImportError: import sys sys.stderr.write( "Error: Can't find the file 'settings.py' in the directory " "containing %r. It appears you've customized things.\nYou'll have to " "run django-admin.py, passing it your settings module.\n" % __file__ ) sys.exit(1) import settings if __name__ == "__main__": setup_environ(settings) import primate primate.patch() ManagementUtility().execute()
为了对您的部署进行猴子补丁,您应该在设置 DJANGO_SETTINGS_MODULE 之后立即应用补丁。
现在将 django.contrib.auth 添加到您的 INSTALLED_APPS
使用
安装此补丁后,您实际上没有任何用户模型。您必须自己创建一个,并在设置中定义它。我将为您提供一个如何使用提供的UserBase类的示例。
project/users/models.py:
from primate.models import UserBase, UserMeta from django.db import models class CustomUser(UserBase): __metaclass__ = UserMeta name = models.CharField(max_length=500, default='Jon Deg') title = models.CharField(max_length=20, blank=True)
settings.py:
``AUTH_USER_MODEL = 'users.models.CustomUser'``
现在您可以通过 from django.contrib.auth.models import User 或 from project.users.models import CustomUser 导入此模型
自定义字段和覆盖默认字段
很简单
要添加一个字段,只需像平常一样将字段添加到模型中即可。
要覆盖一个字段,只需覆盖字段名称,它将替换掉在 UserBase 中定义的字段。
覆盖功能是正常Django模型抽象类中不存在的特殊功能,它是在自定义元类中实现的。你也可以通过稍微修改元类来删除在 UserBase 类中定义的字段,你可以在代码中查看,这非常简单。
管理界面
为了使管理界面正常工作,我已经制作了猴子补丁 primate.patch 来覆盖 admin.autodiscover,这样它就不会注册 django.contrib.auth.User 的默认管理类。这意味着你需要自己注册。最简单的方法是将 users 添加到你的 INSTALLED_APPS 中,然后向 ùsers/admin.py 添加类似的内容
from primate.admin import UserAdminBase from django.contrib import admin from django.contrib.auth.models import User class UserAdmin(UserAdminBase): pass admin.site.register(User, UserAdmin)
与 django.contrib.auth.models.User 相比,UserBase 中现在有什么不同?
我已经做了一些小的修改
删除了 first_name 和 last_name
添加了 name
username 现在最多50个字符
使 email 唯一
get_profile 方法现在只返回 self
如前所述,你现在可以更改所有这些,在你的用户模型中删除、添加和覆盖字段。
South
我有点担心,这是一个主要功能,幸运的是Andrew已经想到了这一点:引用文档中 SOUTH_MIGRATION_MODULES 下的内容
“请注意,此字典中的键是‘应用程序标签’,而不是应用程序的完整路径;例如,如果我为 django.contrib.auth 提供一个迁移目录,我想要在这里使用 auth 作为键。”
所以现在到了时候,只需将以下内容添加到你的设置中
SOUTH_MIGRATION_MODULES = { 'auth': 'users.migrations', }
替代密码散列
SHA-1是Django密码的默认散列算法。有些人可能不同意这是最佳选择。django-primate 使你能够使用替代散列,你只需覆盖自定义用户模型中的 check_password 和 set_password 方法即可。由于bcrypt是一个不错的选择,所以你可以通过这种方式简单地实现散列
``project/users/models.py``:: from primate.models import UserBase, UserMeta, BcryptMixin from django.db import models class CustomUser(BcryptMixin, UserBase): __metaclass__ = UserMeta
请注意,这将在授权成功后更新所有密码以使用bcrypt。
项目详情
django-primate-0.1.1.tar.gz的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 4930fb9e4b5791c7c41a3887c9277c61f16b851b758ecb3b5ca09eea0491c65f |
|
MD5 | b70f07a20296182290dc7fbc3f5555cb |
|
BLAKE2b-256 | 6bc8eb3e5918432b58e485039c93228792ca80ccc7ad6eb00980be917150167c |