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

发布于:2022-11-04 ⋅ 阅读:(586) ⋅ 点赞:(0)

在这里插入图片描述

在这里插入图片描述


  浏览器请求服务器是无状态的。默认情况下,浏览器请求服务器端的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
  • 普通
response.set_cookie(key='uname', value='San Ha', max_age=3*24*60*60)
  • 加盐

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

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

4. 获取cookie

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

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
#获取cookie
def abc_view(request):
    #返回所有cookie数据
    print request.COOKIES
    #返回KEY='hello'的数据
    print request.get_signed_cookie('hello',salt='hahaha')
 
    return HttpResponse('hello')

附加

# 加密
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)

网站公告

今日签到

点亮在社区的每一天
去签到