Django
内置一个 auth
模块,帮助用户实现注册、登陆、注销以及修改密码等功能,帮助开发者省去了不少功夫python
auth_user
auth
模块中维护用户信息的关系模式(继承了models.Model
), 数据库中该表被命名为auth_user
auth_group
auth_user_user_permissions
user.user_permissions
关联,在数据库中由auth_user_user_permissions
数据表维护。auth_user_groups
groups
的多对多字段, 多对多关系由auth_user_groups
数据表维护。Group对象能够经过user_set
反向查询用户组中的用户。auth_group_permissions
auth_permission
django.contrib.auth
模块要使用Django
自带的认证功能,首先要导入auth
模块数据库
from django.contrib import auth
auth
提供的方法authentioate()
django
提供了用户认证,即验证用户名以及密码是否正确,通常须要
username
和password
两个关键字参数;session若是经过认证,
authentioate()
函数会返回一个User
对象;app
authentioate()
函数会在User
对象上设置一个属性标识,这个属性标识通过数据库验证用户名和密码;函数当咱们试图登陆一个从数据库中直接取出来不通过
authentioate()
的User
对象时会报错。工具
login(request)
网站
接收一个
HttpRequest
对象,以及一个经过authentioate()
函数认证的User对象;ui实现用户登陆功能,会在后台为登陆用户生成
session
数据;url执行过
login()
方法的用户对象,就能经过request.user
拿到当前登陆的用户对象,从而取出用户的相关信息,不然取得的将是一个匿名用户对象AnonymounsUser Object
。
logout(request)
接收一个
HttpRequest
对象,无返回值;当调用函数时,当前请求的session信息所有被清除;
即便当前用户没有登陆,调用该函数也不会报错。
login_required()
auth
模块提供的一个装饰器工具,可以便捷地为某个视图添加登陆校验。若用户没有登陆,则默认会跳转到
accounts/login/
,并传递当前访问url
绝对路径。自定义跳转路径,只需在
settings.py
中添加:LOGIN_URL = '/login/'from django.contrib.auth.decorators import login_required @login_required def home(request): pass
User
对象的方法is_authentioated()
检查用户是否已经经过了认证;
若是是经过
auth
函数返回的真实的User
对象,返回值则为True;
create_superuser()
该方法用于建立一个超级用户,接收
username、password
两个必要参数。效果与执行python manage.py createsuperuser
等同。
create_user()
通常状况
create_superuser()
方法不多使用,最常使用的是create_user()
方法,它将会建立一个普通用户,常应用于注册视图中。建立用户所需字段,应与
auth_user
数据表中字段对应。
set_password[password]
该方法用于修改密码,接收要新密码做为参数,最后必定要执行
save()
方法保存,不然无效。
check_password[password]
检查登陆用户密码是否正确,须要当前请求用户的密码;
密码正确返回 True,不然返回 False。
is_staff
判断用户是否拥有网站的管理权限
is_active
判断是否容许用户登陆。
设置为False时能够不用删除用户来禁止用户登陆。
auth
模块拓展因为 auth
模板中 auth_user
数据表字段是固定的,所以当咱们使用 auth
模块,想要添加额外的字段时,就须要对其进行拓展。
拓展的方法:
模型中新增一个表,与 auth_user
表一对一关联
继承内置的 AbstractUser
类:经常使用
模型 models.py
中新建一个类,继承自 AbstractUser
:
from django.contrib.auth.models import User, AbstractUser # 导入 AbstractUser 类 class UserInfo(AbstractUser): """ 继承 AbstractUser 新增字段:phone、addr """ phone = models.CharField(max_length=11, verbose_name='手机号码') addr = models.CharField(max_length=128, verbose_name='家庭地址')
配置 settings.py
新增的类继承
AbstractUser
,拓展后将会覆盖auth_user
表,所以须要配置settings
,使默认认证知道要使用哪一种表认证。
# settings.py # 在最后添加以下代码 AUTH_USER_MODEL = 'app名.新增的类名' AUTH_USER_MODEL = 'app.UserInfo' # 示例
迁徙数据表
python manage.py makemigrations python manage.py migrate
建立用户
拓展
auth
模块后,使用的再也不是原来auth_user
表,而是新表app.UserInfo
表,所以在建立用户时应该注意。
# 拓展以前 from django.contrib.auth.models import User user_obj = User.objects.create_user(username='lila', password='1234') # 拓展以后 from app.models import UserInfo user_obj = UserInfo.objects.create_user(username='lila', password='1234')
auth
模块时,须要将 migrations
文件夹下文件(如:0001_initial.py
文件删除),不然会报 ValueError: Related model u'app.model' cannot be resolved
。