Django用户模型——基于AbstractBaseUser重新定义用户模型

Django的设计哲学

学好一门武功,心法很重要。

学Django也是一样,要学好Django,首先要认可Django的设计哲学,如果对Django不认可,肯定是学不好的。

Django设计哲学:

  1. 松耦合:降低耦合度同时加强聚合度。

    例如:

    1)模板系统不需要知道用户的 Web 请求,数据库层不需要了解如果显示数据,而视图并不关心程序员所使用的模板系统。

    2)Django 应用中的 URL 不应该与底层 Python 代码耦合。将 URL 与 Python 函数名联系起来是一件很糟糕且丑陋的做法。(Flask说:你是在说我吗?=_=)

    1. 视图不应该关心开发人员使用哪种模板——甚至根本不用模板系统。
  2. 更少的代码

    Django应用的代码应该尽可能地精简。

    例如:缓存应该尽可能快。因此,围绕缓存后端的所有框架代码都应该保持在绝对的最小值,特别是对于“get()”操作。

  3. 快速开发

    Django 可以做到快速的 Web 开发。

  4. 不要重复地造轮子 (DRY)

    每个独特的概念或数据片应该存在且只存在于一个地方。避免冗余,做好标准化。

  5. 明确优于隐式

    字段不应该仅仅根据字段的名称来假定某些行为。这需要对系统有太多了解,并且容易出现错误。相反,其行为应该基于关键字参数,并且在某些情况下,应该基于字段的类型

  6. 一致性

    框架应在所有层级上保持一致。一致性适用于从低级(Python 的编码风格)到高级(使用 Django 的“经验”)的所有内容。

    缓存API应该为不同的缓存后端提供一致的接口。

  7. 从 HTML 中解耦

    模板系统不应该被设计成只能输出 HTML。它应该同样擅长生成其他基于文本的格式,或者仅仅是纯文本。(JsonResponse了解一下)

  8. 简介

    编写视图应该和编写Python函数一样简单。开发人员不应该在函数执行时实例化一个类。

Django大法好

  1. Django开发速度快。例如:纽约时报,卫报,Pinterest和Instagram等网站都是用Django做的。
  2. Django的用户活跃,文档丰富。
  3. 你可以在DjangoProject.com上找到丰富的开源项目。
  4. Django可以非常方便地与memcached、redis一起使用,提高页面的加载速度。
  5. App 可插拔,一行注释决定是否启用app。

Django User模型好

代码位置:django.contrib.auth.models.User

这个模型中预先定义了一些字段,其中只有username和password是必须的。

优点:

  1. 自带后台
  2. 常用的权限功能都已经封装好了,例如:authenticate、logout等。
  3. authenticate、logout只有对内置的User模型才生效。

满足个性化需求

Django的内置身份验证系统非常棒。在大多数情况下,我们可以开箱即用,节省了大量的开发和测试工作。它适合大多数用例,并且非常安全。但有时我们需要做一些调整,以适应我们的Web应用程序。

基于AbstractBaseUser重新定义用户模型

使用场景:

  • 您非常满意Django处理身份验证过程的方式时
  • 并且不会更改它的任何内容
  • 但又希望直接在用户模型中添加一些额外信息,而不必创建额外的类。

实例:

class User(AbstractBaseUser):
    email       = models.EmailField(max_length=255, unique=True)
    full_name   = models.CharField(max_length=255, blank=True, null=True)
    is_active   = models.BooleanField(default=True) # can login 
    staff       = models.BooleanField(default=False) # staff user non superuser
    admin       = models.BooleanField(default=False) # superuser 
    timestamp   = models.DateTimeField(auto_now_add=True)
    # confirm     = models.BooleanField(default=False)
    # confirmed_date     = models.DateTimeField(default=False)

    USERNAME_FIELD = 'email' #username
    # USERNAME_FIELD and password are required by default
    REQUIRED_FIELDS = [] #['full_name'] #python manage.py createsuperuser

参考资料:

https://github.com/codingforentrepreneurs/eCommerce/blob/master/src/accounts/models.py

https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html

https://docs.djangoproject.com/zh-hans/2.1/misc/design-philosophies/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值