Django框架学习笔记(20.Cookies简易实例)

1.Cookie本质是客户端浏览器上的一个文件


这里用Cookies实现简单的用户登录:

views.py:

def login(request):
    if request.method == "GET":
        return render(request, 'login.html')
    if request.method == "POST":
        u = request.POST.get('username')
        p = request.POST.get('pwd')
        dic = user_info.get(u)
        if not dic:
            return render(request, 'login.html')
        if dic['pwd'] == p:
            res = redirect('/index/')
            res.set_cookie('username111', u)
            #max_age设置失效时间(秒)
            return res
        else:
            return render(request, 'login.html')


def index(request):
    v = request.COOKIES.get('username111')
    if not v:
        return redirect('/login/')
    return render(request, 'index.html', {'current_user': v})

index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>欢迎{{ current_user }}登录</h1>
</body>
</html>


login.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/login/" method="POST">
    <input type="text" name="username" placeholder="用户名"/>
    <input type="password" name="pwd" placeholder="密码"/>
    <input type="submit" value="登录"/>
</form>
</body>
</html>


这样直接访问index不会成功,必须要登录后才可以访问,访问成功后页面显示当前的用户名。


cookie这里还可以设置参数,这里介绍一个常用的(这里的cookies只在五秒内有效):

import datetime
current_date = datetime.datetime.utcnow()
current_date = current_date + datetime.timedelta(seconds=5)
res.set_cookie('username111', u, expires=current_date)


这里的Cookies是明文的,可以机密,比如这样(这里的salt是自己任意写的,但是要注意,设置和获取的盐要一致):

obj = HttpResponse('666')
obj.set_signed_cookie('username', 'root', salt="jiageyan")
request.get_signed_cookie('username', salt="jiageyan")





有时候需要多次用户认证,为了不重复写代码,可以加入用户认证装饰器:

FBV装饰器:

def auth(func):
    def inner(request, *args, **kwargs):
        v = request.COOKIES.get('username111')
        if not v:
            return redirect('/login/')
        return func(request, *args, **kwargs)

    return inner


@auth
def index(request):
    v = request.COOKIES.get('username111')
    return render(request, 'index.html', {'current_user': v})

CBV装饰器:

def auth(func):
    def inner(request, *args, **kwargs):
        v = request.COOKIES.get('username111')
        if not v:
            return redirect('/login/')
        return func(request, *args, **kwargs)

    return inner
from django import views
from django.utils.decorators import method_decorator

@method_decorator(auth, name='dispatch')
class Order(views.View):
    #装饰类的原理相当于下边这三行代码
    #@method_decorator(auth)
    #def dispatch(self, request, *args, **kwargs):
    #    return super(Order, self).dispatch(self, request, *args, **kwargs)

    def get(self, request):
        v = request.COOKIES.get('username111')
        return render(request, 'index.html', {'current_user': v})

    def post(self, request):
        v = request.COOKIES.get('username111')
        return render(request, 'index.html', {'current_user': v})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值