day94-django-cookie登录校验
#cookie多用于登录和投票。 #1.cookie是浏览器里的键值对。 #2.cookie在请求头里面,每次向服务器发请求,都带着cookie过去。 #3.当登录成功,服务器给浏览器的cookie设置(添加)键值对,作为下一步访问服务器其他页面的凭证。 #4.服务器的每个页面都有对凭证的判断,当没有凭证时,就是没有登录,返回登录页面, # 如果有凭证,就返回用户请求的内容。 #5.本例使用装饰器封装了判断是否有凭证的代码,当网站内容、页面比较多时,很好用。 #6.set_cookie的值是明文,而set_signed_cookie是给cookie签名,值是密文。 # obj.set_cookie('ticket','val')设置键值对 # request.COOKIES.get('ticket')取值 # # obj.set_signed_cookie('ticket','val',salt='abc')设置键值对,加盐 # request.get_signed_cookie('ticket',salt='abc')取值,写上盐 #7.obj.set_cookie('ticket','val',max_age=10),max_age=10是服务器给浏览器设置的cookie键值对 # 最多保留10秒,10秒后消失(设置超时时间)。
#8.render,redirect,HttpResponse都可以设置cookie。
from django.contrib import admin from django.urls import path from django.shortcuts import render,HttpResponse,redirect def login(request): if request.method == 'GET': return render(request,'login.html') else: name = request.POST.get('name') password = request.POST.get('password') if name == 'a' and password == 's': obj = redirect('/ook/') # 给浏览器设置cookie(键值对),在浏览器的网络-cookie中可看到。 obj.set_cookie('ticket','val',max_age=10) return obj else: return render(request,'login.html',{'error':'姓名或密码错误'}) #装饰器 def wapper(f): def inner(request): # 获取请求头中cookie值(凭证) v = request.COOKIES.get('ticket') # 如果没有这个值(值为空),返回登录页面 if not v: return redirect('/login/')#return这一句下面的代码不执行 # 如果有这个值,返回用户请求的内容 n = f(request) return n return inner @wapper def ook(request): return HttpResponse('ook') @wapper def ook1(request): return HttpResponse('ook1') urlpatterns = [ path('admin/', admin.site.urls), path('login/', login), path('ook/', ook), path('ook1/', ook1), ]
login.html
<body> <form method="POST" action="/login/"> <p>姓名: <input type="text" name="name"> </p> <p>密码: <input type="password" name="password"> </p> <p> <input type="submit" value="登录"> <span style="color:red;">{{ error }}</span> </p> </form> </body>