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页面")
    
  • 相关阅读:
    MySQL "show users"
    MySQL
    A MySQL 'create table' syntax example
    MySQL backup
    MySQL show status
    Tomcat, pathinfo, and servlets
    Servlet forward example
    Servlet redirect example
    Java servlet example
    How to forward from one JSP to another JSP
  • 原文地址:https://www.cnblogs.com/zyk01/p/10176316.html
Copyright © 2011-2022 走看看