Auth模块
Auth模块是Django自带的功能强大的用户认证模块. 在网站的开发中, 用户管理系统的设计也是一个麻烦的问题, 此时我们需要实现包括用户的注册, 登录, 注销, 认证, 密码管理等功能.
Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据。
使用Auth模块主要还是需要熟悉它的API, 更详细的信息需要参考官方文档auth模块.
属性
is_authenticated
这个属性用来判断用户是否认证(登录)过, 返回一个布尔值. 用户登录了返回True.否则返回返回False
is_anonymous
该属性判断一个用户是否是匿名用户, 返回一个布尔值. 与is_authenticated
相反.
常用方法
set_password(raw_password)
这是一个修改密码的方法, 需要接受原来的密码为参数.
这个方法有一个坑, 就是设置完密码之后, user对象需要调用save方法来保存结果到数据库中.
check_password(raw_password)
提供原来的密码来到数据库中进行比对, 正确则返回True, 错误则返回False
create_user(username, email=None, password=None, **extra_fields)
当我们使用auth组件之后, 就尽量都使用auth内部已经提供的功能了, 这个创建用户的方法能够自动使用set_password()来创建新用户保存到数据库中. 而如果使用原来的create方法, 则会使用明文保存到数据库中.
create_superuser(username, email=None, password=None, **extra_fields)
方法功能与create_user
一样, 只不过这个方法是创建超级用户.
authenticate(request, username=None, password=None, **kwargs)
提供用户的登录认证功能, 验证用户的用户名与密码是否正确, 如果认证成功, 会返回一个user对象.
logout(request)
接收一个request对象, 将该用户在session表中的信息清除掉, 即使用户没有登录, 使用这个方法也不会报错.
login(HttpRequest, user)
该函数接受一个HttpRequest对象,以及一个经过认证的User对象.
该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关session数据. 用户登录之后就会在session表中填写自己的登录信息.
login_requierd()
这个方法是一个登录装饰器, 它能帮我们为一些视图函数提供登录验证.
如果用户没有登录, 这个登录用户会让用户自动跳转到登录的页面. Django默认的登录页面的URL为/accounts/login/
, 这时候我们需要配置登录的URL, 第一种就是局部配置, 在每一个需要登录的视图上指定跳转的登录url. 或是在settings文件中进行全局的配置.
@login_required(login_url='/login/')
def test(request):
pass
# 或是全局配置, 然后装饰器上不指定跳转的url
@login_required
def test(request):
pass
# settings.py
LOGIN_URL = '/login/' # 登录页面的url
user对象的字段属性
username
用户名, 必须填写
password
密码字段, 以密文存储.
邮箱字段
is_staff
bool类型, 判断用户是否允许登录admin_site
is_active
用户是否是激活状态
is_superuser
是否是超级管理员
更多字段, 参考文档
扩展auth表
很多时候Django预定义的表并不能满足我们的需求, 那么我们就可以通过继承的方式来继承auth_user表来进行扩展.
Django的默认的user表位于django.contrib.auth.models.AbstractUser
, 我们只需要继承这个内置类, 就可以实现扩展功能和属性了.
class User(AbstractUser):
create_time = models.DateField(auto_now_add=True)
blog = models.CharField(max_length=32)
但是按照上面进行扩展之后, 需要告诉Django不需要再在迁移的时候, 生成默认的auth_user表了.
这需要在settings文件中配置, 使用了自定义的认证表之后, 原来的表也就不能使用了.
AUTH_USER_MODEL = "app名.User"