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>
原文地址:https://www.cnblogs.com/python-daxiong/p/12690226.html