跳转到主要内容

模块化的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 Userfrom 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 中现在有什么不同?

我已经做了一些小的修改

  1. 删除了 first_namelast_name

  2. 添加了 name

  3. username 现在最多50个字符

  4. 使 email 唯一

  5. get_profile 方法现在只返回 self

如前所述,你现在可以更改所有这些,在你的用户模型中删除、添加和覆盖字段。

South

我有点担心,这是一个主要功能,幸运的是Andrew已经想到了这一点:引用文档中 SOUTH_MIGRATION_MODULES 下的内容

“请注意,此字典中的键是‘应用程序标签’,而不是应用程序的完整路径;例如,如果我为 django.contrib.auth 提供一个迁移目录,我想要在这里使用 auth 作为键。”

所以现在到了时候,只需将以下内容添加到你的设置中

SOUTH_MIGRATION_MODULES = {
    'auth': 'users.migrations',
}

替代密码散列

SHA-1是Django密码的默认散列算法。有些人可能不同意这是最佳选择。django-primate 使你能够使用替代散列,你只需覆盖自定义用户模型中的 check_passwordset_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 (13.2 kB 查看散列)

上传时间

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面