模块化django用户
django-primate的Python项目详细描述
- 模块化django用户。
我不打算讨论这是否是个好主意。这个Django application monkey补丁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()
要对部署进行monkey修补,您可以在设置之后立即应用修补程序 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类中定义的字段 可以看一下代码,这真的很简单。
管理
为了让管理员工作,我已经将monkey补丁primate.patchpatch 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
如前所述,现在可以更改所有这些,删除添加和重写字段 在你的用户模型中。
南部
我很担心,这是一个主要的功能,Luckley Andrew已经想到: 来自SOUTH_MIGRATION_MODULES:
“请注意,此词典中的键是'app labels',而不是指向 应用程序;例如,我是否要为 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。