zoukankan      html  css  js  c++  java
  • 【Django】Cookie

    "@



    Cookie介绍


    Cookie的由来

    大家都知道HTTP协议是无状态的.

    无状态的的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况.

    人生只如初见,对于服务器来说,每次的请求都是全新的.

    状态可以理解为客户端和服务器在某次会话中产生的数据.
    无状态就可以理解为这些数据不会被保留.
    会话中产生的数据又是我们需要保存的,也就是说要"保持状态",因此Cookie就在这样一个场景下诞生了.


    什么是Cookie

    Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对。下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用的信息.
    Cookie本身最大支持4096字节.


    Cookie的原理

    由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是"谁"了.


    查看Cookie

    我们使用Chrome浏览器,打开开发者工具:
    在这里插入图片描述



    操作Cookie


    获取Cookie

    def login(request):
        # 获取Cookie:
        ret = request.COOKIES['user']
        # ret = request.COOKIES.get('user')
        # request.get_signed_cookie(key, salt='user', default='')
        # request.get_signed_cookie('user', default=RAISE_ERROR, salt='', ax_age=None)
        return render(request, 'login.html')
    

    get_signed_cookie方法的参数:

    • default:默认值
    • salt:加密盐
    • max_age:后台控制过期时间

    def test(request):
        rep = HttpResponse('is ok')
        # 设置Cookie:
        rep.set_cookie('user', 'zyk')
        # rep.set_signed_cookie('user', 'zyk', salt="加盐")
        return rep
    

    查看设置的Cookie,如图:
    在这里插入图片描述

    set_cookie方法的参数:

    • key:键.
    • value='':值.
    • max_age=None:超时时间.
    • expires=None:指定IE浏览器超时时间(IE requires > expires, so set it if hasn't been already.).
    • path='/':Cookie生效的路径,/表示跟路径,特殊的:跟路径的cookie可以被任何url的页面访问.
    • domain=None:Cookie生效的域名
    • secure=False:https传输
    • httponly=False:只能http协议传输,无法被JavaScript获取(也不是绝对,底层抓包可以获取到也可以被覆盖).

    删除Cookie

    def test(request):
        rep = HttpResponse('is ok')
        # 删除Cookie:
        rep.delete_cookie('user')
        return rep
    

    Cookie版登陆校验:

    from django.shortcuts import render, redirect, HttpResponse
    from blog01 import models
    
    
    # 装饰器函数
    def login_required(fn):
        """如果未登陆,将返回login页面"""
        def inner(request, *args, **kwargs):
            print(request.COOKIES.get('is_login'))
            if request.COOKIES.get('is_login') != '1':
                # 获取当前url路径
                next = request.path_info
                return redirect('/login/?next=%s' % next)
            ret = fn(request, *args, **kwargs)
            return ret
        return inner
    
    
    # 登陆功能
    def login(request):
        if request.method == 'POST':
            user = request.POST.get('user')
            pwd = request.POST.get('pwd')
            if models.Userinfo.objects.get(name=user, pwd=pwd):
                # 提取跳转之间访问的页面
                next = request.GET.get('next')
                rep = redirect(next) if next else redirect('/home/')
                # 设置Cookie,  max_age=1:指定过期时间为1秒
                rep.set_cookie('is_login', '1', max_age=1)
                return rep
        return render(request, 'login.html')
    
    
    @login_required
    def home(request):
        return HttpResponse("我是home页面")
    
    
    @login_required
    def home01(request):
        return HttpResponse("我是home01页面")
    

    "

  • 相关阅读:
    OilPaint(转载/实验)
    UE4 3D artist
    render pipeline about (翻译)
    Python 相对导入 碎碎念
    USF, USH Grammar
    JZ19 顺时针打印矩阵
    JZ49 把字符串转换成整数
    JZ45 扑克牌顺子
    JZ53 表示数值的字符串
    JZ48 不用加减乘除做加法
  • 原文地址:https://www.cnblogs.com/zyk01/p/11376035.html
Copyright © 2011-2022 走看看