Django用户认证
1、cookie
1、用户首次在地址栏访问页面,带空的cookie去,验证不通过,跳转到登录页面
2、用户输入登录信息,发送给服务器,服务器验在用户表里验证用户存在后设置cookie,将设置
的cookie返回给浏览器并保存,否则登录信息不正确返回错误提示
3、用户再次访问其他页面时,带着保存的cookie,服务器验证cookie信息,显示用户已登录
则允许访问,否则重定向到登录页面
注:一个浏览器访问同一个服务器时会在django_session 表里生成一条记录
多个浏览器访问同一个服务器时会在Django_session 表里生成多条记录
覆盖:浏览器会保持最后的一次会话,覆盖前几次会话
2 session
1、第一次访问时携带一个空的cookie{},服务器验证不过跳转到登录页面
2、用户首次输入登录信息,发送给服务器,服务器验在用户表里验证用户存在后设置cookie,
服务器随机生成一个字符串,将随机字符串放入cookie里,并将随机字符串插入session_key 字段 ,
将用户信息组成一个字典写入session_data字段
3、将随机生成的字符串放入cookie里返回给浏览器,用户下次访问浏览器时会带着cookie{},根据随机字符串验证用户信息,若是
同一个用户,验证通过,若是新的用户登录,会重新生成一个随机的字符串,覆盖之前的信息
注:如果直接访问登录后的页面带着cookie,request.session执行三个步骤
1、获取到随机字符串
2、到Django_session 表过滤到session_key(随机字符串)
3、取到对应的session_data 反序列化成数据字典 {"susername":"egon","slogin":True}
上诉三步总结为一句代码为:data=request.session.get('slogin')
然后:
if not data:重定向到登录页面
else:跳转到要访问的页面
3、用户认证组件
利用auth组件
首先输入登录信息
获取到用户信息
通过auth模块到auth_user表去验证用户存在与否
user_obj=auth.authenticate(username=user,password=pwd)
if user_obj:
保存用户信息到Django_session
auth.login(user_obj) #将当前用户对象赋给request.user ,request.user 是全局变量以后在任何的方都可以使用request.user,
#包括在HTML前端 如:{{request.user.username}}
重定向到访问页面
else:
重定向到登录页面
当未登录任何用户时,默认为匿名用户,其各项信息如下:
request.user :默认匿名对象
request.user.id : None
request.user.username:''
request.user.is_active:False
当有用户登录时,可以通过request.user 获取到用户信息
print(request.user.is_authenticated)
匿名用户为False, 有用户登录为True
最后用户认证组件登录:
login登录认证
1 def login(request): 2 if request.method=='GET': 3 #地址栏输入,GET请求 4 return render(request,'login.html') 5 else: 6 #获取用户信息 7 use=request.POST.get('usename') 8 pwd=request.POST.get('pwd') 9 10 #判断用户是否存在 11 use_obj=auth.authenticate(username=use,password=pwd) # 把当前对象赋给request.user(全局变量) 12 if use_obj: 13 #保存用户信息 14 auth.login(request,use_obj) 15 #重定向 16 return redirect('/app01/showbook/')
最后在访问的页面加上认证:
1 if not request.user.is_authenticated: 2 return redirect('/app01/login/')
用户注销
def logout(request): #注销 auth.logout(request) return redirect('/app01/login/')