Django auth认证组件 简介
'''
Django auth认证组件提供了用户表的构建方式,认证接口,会话登录与注销接口. 中间件将会话登录用户保存到request对象中,这样不用从会话中获取用户id,再通过model获取用户对象.
对于认证接口要提供用户名和密码传入auth.authenticate(username,password),认证成功, 就可以得到认证用户对象.
只需要根据认证结果是否有对象,来判定认证结果,来进行后面的操作.返回的用户对象传入auth.login(request,user)接口,调用接口,可以会将用户登录信息记录到session中.
'''
auth组件常用api
1, auth.authenticate(username=login_name,password=pwd)
# 认证成功返回User对象,失败返回None
2, auth.login(request, user)
# 注意request是必须的,是请求对象,user是通过authenticate认证后得到的。作用会话登录,将登录信息保存到会话中。如果当前会话已经产生会flush。
3, request.user
# 这个就是一个django.utils.functional.SimpleLazyObject对象,如果authenticate认证成功,返回的对象是model-user对象,也就是auth_user表对象;将该对象进过auth.login后,那么request.user就是相应的该用户;不然就是一个anonymous用户。通过request.user可以判定是否有用户登录。
# 重要:request.user是一个全局变量,可以在视图和模版中使用。
4, auth.logout(request)
# 登出当前session中登录的用户,如果没有用户登录,也不会报错。登出后request.user就是annoymouse用户了。会清空会话。
5, reques.user.username
# 可以判定是否有用户登录。不能使用request.user判定是否有用户登录,因为没有用户登录,这个也会返回一个annoymouse用户,只有访问其属性才会返回一些False值。
#所以通过request.user.* 的属性才能判定是否有用户登录的状态。
6, request.user.is_authenticated
# 判定是否登录返回True或False.
7, django.contrib.auth.get_user_model()
# 可以获取到当前auth组件使用的认证model类
注意区别两个API判定 ‘是否认证’ 与 ‘是否认证成功的区别’
# auth.authenticate() 与 request.user.is_authenticated 的使用场景和功能区别:
'''
前者 是 认证 ,其返回的结果是User_obj 或者 None,目的是判定认证是否成功,仅仅使用在登录认证view视图函数中。
后者 是 是否有用户登录, 其返回结果是True 或者False。目的是校验用户是否登录了,用于除了登录认证view与不校验用户登录的view。即需要校验用户登录状况才有后续操作的情景中。这个的前提是auth.authenticate和auth.login 两个登录过程操作。只有两者操作了,才有登录的判定。
'''
Auth组件默认auth_user表常用操作
# 1、校验用户账号及密码,校验成功返回user对象
from django.contrib.auth import authenticate
user = authenticate(username=usr, password=pwd)
# 2、注册用户到request对象中,注册成功可以request.user访问当前登录用户(会形成session记录)
from django.contrib.auth import login
login(request, user) # 注册authenticate成功(当前登录)的用户
# 3、注销当前注册的user (用户注销)
from django.contrib.auth import logout
logout(request)
# 4、校验用户登录状态
# 视图函数中使用
if request.user.is_authenticated(): pass
# 模板语言中使用
{% if request.user.is_authenticated %}
{% else %}
{% endif %}
# 5、校验登录状态的装饰器
from django.contrib.auth.decorators import login_required
@login_required(login_url='/user_login/')
def user_home(request):
return render(request, 'user.html', locals())