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/')
原文地址:https://www.cnblogs.com/liaopeng123/p/9891249.html