Cookie和Session
什么是Cookie
在网站开发中,使用HTTP协议传输数据。HTTP协议是无状态的协议,一旦数据交换完毕,客户端和服务器端的连接就会关闭,再次交换数据需要建立新的连接。这也就意味着服务器无法从连接上跟踪会话。Cookie的出现就是为了解决这个问题,它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都是采用Cookie来跟踪会话。用户第一次登录后服务器会返回一些数据(这里指Cookie)给浏览器,浏览器将数据保存在本地,当用户再次发送请求时,浏览器会将请求数据及Cookie一同提交给服务器。服务器检查Cookie信息,以此来确认用户状态。不同浏览器有不同的存储Cookie大小,但一般不超过4KB。
什么是Session
Session 是另一种记录客户状态的机制,是一次浏览器和服务器的交互的会话。会话是什么呢? 浏览器请求一次服务器,服务器接收请求,处理之后,给出响应,这就是一次会话。为了记录 Session,在客户端和服务器端都要保存数据,客户端Cookie中记录一个标记(session_id),服务器端不但存储了这个标记同时还存储了这个标记映射的数据(key-value)。在服务器端记录的 key-value,其中key是指 session_id,value是指Session的详细内容。用户在做HTTP请求时,会生成一个随机且唯一的 session_id,并传递给服务器,服务器把它存储在内存中。然后服务器根据这个session_id 来查询Session的内容(即value)。当关闭页面时,此session_id会自动注销,重新登录此页面时, 又会再次生成随机且唯一的session_id。
Django操作Cookie
设置Cookie
设置Cooki是设置值给浏览器的。因此需要通过response的对象来设置。设置Cookie可以通过response.set_cookie
来设置,这个方法有如下的相关参数:
key
:cookie的key;value
:cookie的value;max_age
:生命周期,单位是秒;expires
:过期时间。跟max_age
类似,不过expires
需要传递一个具体的日期。如果同时设置了max_age
和expires
,将会使用expires
的值作为过期时间;path
:对域名下哪个路径有效,默认是对域名下所有路径都有效;domain
:针对哪个域名有效。默认是针对主域名有效,若只针对某个子域名才有效,那么可以设置这个属性;secure
:是否是安全的,如果设置为True,那么只能在HTTPS协议下才可用;httponly
:默认是False。若为True,那么在客户端不能通过JavaScript进行操作。
from django.http import HttpResponse
from datetime import datetime
def index(request):
response = HttpResponse("index")
# response.set_cookie("username", "laobai",max_age=180)
expires = datetime(year=2024, month=1, day=1, hour=0, minute=0, second=0)
response.set_cookie("username", "laobai", expires=expires)
return response
删除Cookie
通过delete_cookie
方法即可删除cookie。实际上删除cookie就是将指定的cookie的值设置为空的字符串,然后将过期时间设置为0,也就是关闭浏览器后就过期。
from django.http import HttpResponse
def delete_cookie(request):
response = HttpResponse('delete')
response.delete_cookie('username')
return response
获取Cookie
from django.http import HttpResponse
def get_cookie(request):
cookies = request.COOKIES
username = cookies.get('username')
return HttpResponse(username)
Django操作Session
django中的session默认情况下是存储在服务器的数据库中,在表中会根据sessionid来提取指定的session数据,然后再把这个sessionid放在cookie中发送给浏览器存储,浏览器下次再向服务器发送请求的时候会自动的把所有cookie信息都发送给服务器,服务器再从cookie中获取sessionid,最后再从数据库中获取session数据。具体操作时,通过request.session
实现。
session的常用方法:
get
:从session中获取指定值;pop
:从session中删除一个值;keys
:从session中获取所有的键;items
:从session中获取所有的值;clear
:清除当前这个用户的session数据;flush
:删除session并且删除在浏览器中存储的session_id,一般用在注销功能上;set_expiry(value)
:设置过期时间;- 整型:代表秒数,表示多少秒后过期;
- 0:代表只要浏览器关闭,session就会过期;
- None:会使用全局的session配置。在settings.py中可以设置SESSION_COOKIE_AGE来配置全局的过期时间。默认是1209600秒,也就是2周的时间。
clear_expired
:清除过期的session。Django并不会清除过期的session,需要手动清理或在终端使用python manage.py clearsessions
命令来清除过期的session。
from django.http import HttpResponse
def session_view(request):
request.session['username'] = ['laobai']
# username = request.session.get('username')
# username = request.session.pop('username')
# print(username)
keys = request.session.keys()
items = request.session.items()
# request.session.clear()
request.session.flush()
return HttpResponse('session view')
修改session的存储机制
默认情况下,session数据是存储到数据库中的,可以通过设置SESSION_ENGINE来更改session的存储位置:
django.contrib.sessions.backends.db
:使用数据库。默认就是这种方案。django.contrib.sessions.backends.file
:使用文件来存储session。django.contrib.sessions.backends.cache
:使用缓存来存储session。想要将数据存储到缓存中,前提是你必须要在 settings.py 中配置好 CACHES ,并且是需要使用Memcached,而不能使用纯内存作为缓存。django.contrib.sessions.backends.cached_db
:在存储数据的时候,会将数据先存到缓存中,再存到数据库中。这样就可以保证万一缓存系统出现问题,session数据也不会丢失。在获取数据的时候,会先从缓存中获取,如果缓存中没有,那么就会从数据库中获取。django.contrib.sessions.backends.signed_cookies
:将session信息加密后存储到浏览器的cookie中。这种方式要注意安全,建议设置SESSION_COOKIE_HTTPONLY=True,那么在浏览器中不能通过js来操作session数据,并且还需要对settings.py中的SECRET_KEY进行保密,因为一旦别人知道这个SECRET_KEY,那么就可以进行解密。在cookie中,存储的数据不能超过4kb。