• 【Django框架】——24 Django视图 06 状态保持Cookie


    在这里插入图片描述

    在这里插入图片描述


      浏览器请求服务器是无状态的。默认情况下,浏览器请求服务器端的web应用的时候是无状态的,无状态主要体现在,当你请求某一个web应用的时候,请求完毕,服务器端会给你响应相应的结果,当第二次请求相同的应用时,默认情况下,不会记录第一次访问请求的状态。

    无状态:指用户每次请求浏览器、服务器的请求都是一次性的。

    无状态原因:浏览器与服务器之间是使用Socket套接字进行通行的,服务器请求结果返回给浏览器之后,会关闭当前的Socket连接,而且服务器也会处理页面完毕之后销毁页面对象,不会记录相关的数据。

    1.Cookie概念

    Cookie,有时也⽤其复数形式Cookies,指某些⽹站为了辨别⽤户身份、进⾏session跟踪⽽储存在⽤户本地终端上的数据(通常经过加密)。

    Cookie最早是⽹景公司的前雇员Lou Montulli19933⽉的发明。

    Cookie是由服务器端⽣成,发送给User-Agent(⼀般是浏览器),浏览器会将Cookiekey/value保存到某个⽬录下的⽂本⽂件内,下次请求同⼀⽹站时就发送该Cookie给服务器(前提是浏览器设置为启⽤cookie)。

    Cookie名称和值可以由服务器端开发⾃⼰定义,这样服务器可以知道该⽤户是否是合法⽤户以及是否需要重新登录等。服务器可以利⽤Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。Cookies最典型记住⽤户名。

    Cookie是存储在浏览器中的⼀段纯⽂本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它⼈使⽤。

    2. Cookie的特点

    Cookie以键值对的格式进⾏信息的存储。

    Cookie基于域名安全,不同域名的Cookie是不能互相访问的,如访问https://aweia.blog.csdn.net/时向浏览器中写了Cookie信息,使⽤同⼀浏览器访问baidu.com时,⽆法访问到https://aweia.blog.csdn.net/写的Cookie信息。

    当浏览器请求某⽹站时,会将浏览器存储的跟⽹站相关的所有Cookie信息提交给⽹站服务器。

    3.设置Cookie

    可以通过HttpResponse对象中的set_cookie⽅法来设置cookie

    def set_cookie(self, key, value='', max_age=None, expires=None, path='/',
                       domain=None, secure=False, httponly=False, samesite=None):
        """
        Set a cookie.
        ``expires`` can be:
        - a string in the correct format,
        - a naive ``datetime.datetime`` object in UTC,
        - an aware ``datetime.datetime`` object in any time zone.
        If it is a ``datetime.datetime`` object then calculate 
        ``max_age``.
        """
        pass
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 普通
    response.set_cookie(key='uname', value='San Ha', max_age=3*24*60*60)
    
    • 1
    • 加盐

    普通cookie是明⽂传输的,可以直接在客户端直接打开,所以需要加盐,解盐之后才能查看。

    response.set_signed_cookie('Key', 'San Ha', salt='Hello')
    
    • 1

    4. 获取cookie

    1. 普通
    # 返回所有cookie数据
    print(request.COOKIES)
        
    # 返回key = 'uname'的数据
    print(request.COOKIES.get('uname'))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 加盐
    print(request.get_signed_cookie('Key', salt='Hello'))
    
    • 1

    5.删除值

    设置过期

    1. 默认情况关闭浏览器就失效

    2. max_age=-1(单位秒)

    3. expires=datetime.datetime.today()+datetime.timedelta(days=-2)(单位⽇期类型)

    4. response.delete_cookie('login',path='/student/login/')

    涉及属性

    1. max_age=1cookie⽣效的时间,单位是秒

    2. expires:具体过期⽇期

    3. path='/':指定那个url可以访问到cookie;'/'是所有 path='/'

    4. domain=None(None代表当前域名):指定那个域名以及它下⾯的⼆级域名(⼦域名)可以访问这个cookiedomain='.baidu.com'

    语法

    #设置cookie
     import datetime
     
    
    def index_view(request):
        response=HttpResponse()
        response.set_cookie('hello','123',max_age=24*60*60*3,path='/student/abc/')
        response.set_cookie('hello','123',path='/student/abc/',expires=date
        time.datetime.today()+datetime.timedelta(days=4))
        response.set_signed_cookie('hello','123',salt='hahaha',path='/student/abc/',
        expires=datetime.datetime.today()+datetime.timedelta(days=
    4))
        return response
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    #获取cookie
    def abc_view(request):
        #返回所有cookie数据
        print request.COOKIES
        #返回KEY='hello'的数据
        print request.get_signed_cookie('hello',salt='hahaha')
     
        return HttpResponse('hello')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    附加

    # 加密
    import base64
    from django.shortcuts import render
    from django.http import HttpResponse, JsonResponse, HttpResponseRedirect
    from django.shortcuts import redirect
    
    # Create your views here.
    
    
    def setCookie(request):
        response = HttpResponse('Hello setCookie')
       
        # 将数据进⾏加密
        values = base64.b64encode('https://aweia.blog.csdn.net/'.encode('utf-8'))
        
        # 将加密数据存⼊到cookie中
        response.set_cookie(key='uname', value=values, max_age=3*24*60*60)
        response.set_signed_cookie(key='key', value='Bei Ji De San Ha', salt='Hello')
        return response
    
    
    # 获取cookie加密数据
        euname = request.COOKIES.get('uname','')
        #对数据进⾏解密
        uname = base64.b64decode(euname)
        return HttpResponse(uname)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    MPLS VPN跨域 Option C2
    如何使tstringgrid中心的单元格文本对齐
    【面试八股】IP协议八股
    Pandas处理异常值的两种方法
    【数据结构】单链表
    “大图模型”亮相外滩大会,蚂蚁开创大模型与图计算融合研究
    客户的关系管理系统
    WPF 入门笔记 - 04 - 数据绑定
    MySQL数据库无法插入中文解决
    嵌入式分享合集46
  • 原文地址:https://blog.csdn.net/m0_68744965/article/details/127622657