十七.用户注册 ---- 图形验证码
注:该篇文章接上一篇 十六.静态页面抽取模板
一、用户模型设计
注意事项:涉及到用户登录功能,不管是前端还是后端都要进行登录信息校验
- 前端校验:静态化的校验,所有的校验用户可以见到
- 后端校验:匹配所有得信息(用户名,密码,手机号, 邮箱)与数据库中的信息进行对比校验
1. 用户表字段分析
- 用户名
- 密码
- 手机号
- 邮箱(目前在我们项目没有邮箱,在项目中默认邮箱状态没有激活)
- 图形验证码,短信验证码 (由于只是一次验证,有时间限制,所以我们用redis缓存,过期就无用了)
2.用户模型设计
django的强大之处在于开发效率高,内置了权限模块之类的很多常用功能。在开始一个新的django项目时,如果权限模块中的User模型不满足项目要求,我们需要扩展或者自定义User模型。
2.1 扩展User模型有两种方法
- 如果你不需要改变数据库存储内容,只是改变行为,那么可以建立有一个基于User模型的代理模型。
- 如果想存储与User模型关联的信息,可以使用OneToOneField到包含其他信息字段的模型。这种one-to-one模型经常被称作Profile模型,因为它可能存储站点用户的非身份验证的相关信息。例如:
from django.contrib.auth.models import User
class Employee(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
department = models.CharField(max_length=100)
2.2 自定义User模型
如果不想使用django内置的权限系统,当然你需要自定义用户模型,这种情况不讨论。当然也不建议这么做,django内置权限系统有大的自定义功能扩展,而不是重复造轮子。
开启一个新项目,官方强烈推荐用户自定义用户模型,即是默认的用户模型目前已经足够,但是未来可能会要扩展。
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
注意: 不要忘记在settings.py中设置AUTH_USER_MODEL指向它。
一旦已经创立数据库表之后再去修改AUTH_USER_MODEL,会困难很多,因为它会影响外键和多对多关系。这个改动并不能自动完成,需要手动修复(巨坑)。
官方文档
3.用户模型代码
Django学习 — UserManager 解析
Django学习笔记——内置用户类AbstractUser与内置认证校验系统
Python中的super()用法
3.1 用户模型
根据上面的分析我们的用户模型代码如下:
from django.db import models
from django.contrib.auth.models import AbstractUser, UserManager as _UserManager
class UserManager(_UserManager):
"""
自定义 user manager 修改在使用`python manage.py createsuperuser`命令时
可以提供email
"""
def create_superuser(self, username, password, email=None, **extra_fields):
return super().create_superuser(username=username, password=password, email=email, **extra_fields)
class User(AbstractUser):
"""
add mobile, email_active fields to Django user model.
"""
mobile = models.CharField('手机号', max_length=11, unique=True, help_text='手机号', error_messages={
'unique': '此手机号码已注册'})
email_active = models.BooleanField('邮箱状态', default=False)
class Meta:
db_table = 'tb_user' # 指定数据库表名
verbose_name = '用户' # 在admin站点中显示名称
verbose_name_plural = verbose_name # 显示复数
def __str__(self):
return self.username
#通过createsuperuser这个命令创建时需要的字段
REQUIRED_FIELDS = ['mobile']
# user 模型相当强大 还要修改必须输入email的这个行为
# 管理器执行
objects = UserManager()
3.2在settings.py文件中添加建立的模型
为什么在调用user模型的时候,不调用自带的user模型类,而调用我们重建的模型类呢?
- 在调用文件时会由上而下运行setting.py文件
- 运行到最后如果没有遇见我们自己定义的user模型声明,则调用自己自带的user模型
- 如果遇见了我们定义的user模型,则调用我们声明的user模型
在settings.py文件中添加如下配置: