浏览器请求服务器是无状态的。默认情况下,浏览器请求服务器端的web
应用的时候是无状态的,无状态主要体现在,当你请求某一个web
应用的时候,请求完毕,服务器端会给你响应相应的结果,当第二次请求相同的应用时,默认情况下,不会记录第一次访问请求的状态。
无状态:指用户每次请求浏览器、服务器的请求都是一次性的。
无状态原因:浏览器与服务器之间是使用Socket
套接字进行通行的,服务器请求结果返回给浏览器之后,会关闭当前的Socket
连接,而且服务器也会处理页面完毕之后销毁页面对象,不会记录相关的数据。
1.Cookie概念
Cookie
,有时也⽤其复数形式Cookies
,指某些⽹站为了辨别⽤户身份、进⾏session
跟踪⽽储存在⽤户本地终端上的数据(通常经过加密)。
Cookie
最早是⽹景公司的前雇员Lou Montulli
在1993
年3
⽉的发明。
Cookie
是由服务器端⽣成,发送给User-Agent
(⼀般是浏览器),浏览器会将Cookie
的key/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
- 普通
# 返回所有cookie数据
print(request.COOKIES)
# 返回key = 'uname'的数据
print(request.COOKIES.get('uname'))
- 加盐
print(request.get_signed_cookie('Key', salt='Hello'))
5.删除值
设置过期
默认情况关闭浏览器就失效
max_age=-1
(单位秒)expires=datetime.datetime.today()+datetime.timedelta(days=-2)
(单位⽇期类型)response.delete_cookie('login',path='/student/login/')
涉及属性
max_age=1
:cookie
⽣效的时间,单位是秒expires
:具体过期⽇期path='/'
:指定那个url可以访问到cookie
;'/'是所有path='/'
domain=None(None代表当前域名)
:指定那个域名以及它下⾯的⼆级域名(⼦域名)可以访问这个cookie
,domain='.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)