登陆验证
因为http协议是无状态协议,但是我们有时候需要这个状态,这个状态就是标识
前端提交from表单,后端获取对应输入值,与数据库对比,由此对象设置一个标识,该对象
在别的视图的时候,有此标识,可以访问,没有则让其去登陆
所以,cookie,session应运而生
一,cookie验证流程
1 cookie 2 客户端(浏览器)第一次请求登陆页面的时候,携带的cookie是空,响应页面也没有给cookie设置 3 提交form 表单的时候,携带的cookie是空,服务器去判断,有这个用户,设置了cookie 4 跳转到首页携带了cookie 5 删除cokkie 6 response.delete_cookie("cookie_key",path="/",domain=name)
设置cookie
1 login 函数视图 2 user=UserInfo.objects.filter(username=user,password=pwd).first() 3 4 if user: 5 obj=redirect("/index/") 6 obj.set_cookie("is_login",True,path='/',max_age=10,expires=10) 7 # cookie 参数 8 # def set_cookie(self, key, 键 9 # value = '', 值 10 # max_age = None, 超长时间 11 # expires = None, 超长时间 12 # path = '/', Cookie生效的路径, 13 # 浏览器只会把cookie回传给带有该路径的页面,这样可以避免将 14 # cookie传给站点中的其他的应用。 15 # / 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问 16 obj.set_cookie("username",user.username) 17 return obj 18 19 index 函数视图 20 ret=request.COOKIES.get('is_login') 21 if ret: 22 return render(request,"index.html") 23 return redirect("/login/")
二,cookie+session验证流程
1 cookie + session 2 与cookie 相同 3 只是cookie保存的是 session_id:随机字符串 客户端 4 随机字符串,data 以键值对方式保存在 django_session里面 服务器 5 跳转首页去跟服务器django_session去拿值 6 删除 session 7 可以删除 del request.session['is_login'] 这也只是在django_session里面的data里面删除这个键值对 8 还可以 这样 request.session.flush() 这样是删除django_sesssion里面的一条记录
设置session
1 login 函数视图 2 user=UserInfo.objects.filter(username=user,password=pwd).first() 3 4 if user: 5 # 注意这里设置 session 6 request.session["Is_login"]=True 7 return redirect("/index/") 8 9 10 index 函数视图 11 ret=request.session.get('is_login') 12 if ret: 13 return render(request,"index.html") 14 return redirect("/login/")
三,auth验证流程
1 auth 2 与cookie 相同 3 随机字符串,data 以键值对方式保存在 django_session里面 客户端 4 跳转首页去跟服务器django_session去拿值 服务器 5 auth 模块有自己的验证机制,通过 6 auth.authenticate(username=user,password=pwd) 匹配验证 7 auth.login(request,user) 设置session 8 request.is_authenticated() 是否通过验证,返回true,false 9 auth.logout(request) 删除django_session一条记录
auth验证 ,httprequest.user
1 HttpRequest.user 2 3 一个 AUTH_USER_MODEL 类型的对象,表示当前登录的用户。 4 5 如果用户当前没有登录,user 将设置为 django.contrib.auth.models.AnonymousUser 的一个实例。你可以通过 is_authenticated() 区分它们。 6 7 例如: 8 9 if request.user.is_authenticated(): 10 # Do something for logged-in users. 11 else: 12 # Do something for anonymous users. 13 14 user 只有当Django 启用 AuthenticationMiddleware 中间件时才可用。
auth验证 实际例子(登陆,注册,更改密码)
注意,from表单里面不应该有button按钮,会当成数据提交
1 from django.contrib.auth.models import User 2 from django.contrib import auth 3 def login(request): 4 if request.method == "POST": 5 user = request.POST.get("user") 6 pwd = request.POST.get("pwd") 7 # django 利用自身auth_user表验证,去表里匹配 8 user=auth.authenticate(username=user,password=pwd) 9 if user: 10 # 验证通过,会记录在 djangos_session 表里面一条记录 给某个已认证的用户附加上session id 11 auth.login(request,user) # 设置session cookie记录 session_id:随机字符串 django_session 随机字符串:session_data 12 return redirect("/index/") 13 14 return render(request, "login.html") 15 16 def index(request): 17 user=request.user # 显示当前登录用户对象 18 19 if not user.is_authenticated(): # 是否通过验证 20 return redirect("/login/") 21 22 name=request.user.username 23 return render(request,"index.html",{"name":name}) 24 25 def log_out(request): 26 ''' 27 注销 28 :param request: 29 :return: 30 ''' 31 auth.logout(request) # request.session.flush() 32 return redirect("/login/") 33 34 35 def reg(request): 36 if request.method == "POST": 37 user = request.POST.get("user") 38 pwd = request.POST.get("pwd") 39 40 user=User.objects.create_user(username=user,password=pwd) # 创建用户信息 41 return redirect("/login/") 42 43 return render(request,"reg.html") 44 45 def setpwd(request): 46 ''' 47 更改 密码 ########### 48 :param request: 49 :return: 50 ''' 51 if request.method == "POST": 52 user = request.POST.get("user") 53 pre_pwd = request.POST.get("pre_pwd") 54 new_pwd = request.POST.get("new_pwd") 55 repeat_pwd = request.POST.get("repeat_pwd") 56 # 没有判断输入新密码2次是否一样 57 user=auth.authenticate(username=user,password=pre_pwd) 58 # 更改密码 ############################# 59 if user: 60 user.set_password(new_pwd) 61 user.save() 62 return redirect("/login/") 63 64 return render(request,"setpwd.html")