Cookies和Session
1. 会话
-
从打开浏览器访问一个网站,到关闭浏览器结束此次访问,称之为一次会话。
-
HTTP协议是无状态的,导致会话状态难以保持。
-
Cookies和Session就是为了保持会话状态而诞生的两个存储技术。
2. Cookies
2.1 Cookies定义
-
Cookies是保存再客户端浏览器上的存储空间。
-
Chrome 浏览器可能通过开发者工具的 Application >> Storage >> Cookies 查看和操作浏览器端所有的Cookies值。
-
火狐浏览器 通过开发者工具的 存储 >> Cookie 查看。
-
2.2 Cookies特点
-
Cookies 在浏览器上是以键值对的形式进行存储到,键和值都是以ASCII字符串的形式存储(不能是中文字符串)。
-
存储的数据带有生命周期。
-
Cookies 中的数据是按照域存储隔离的,不同的域之间无法访问。
-
Cookie 的内部数据会在每次访问此网址时都会携带到服务器端,如果Cookies过大会降低响应速度。
2.3 Cookies的使用
# 设置/修改Cookie
HttpResponse.set_cookie(key,value='',max_age=None,expires=None)
## key:Cookie的名字
## value:Cookie的值
## max_age:Cookie存储时间,秒为单位
## expires:具体的过期时间
## 当不指定 max_age 和 expires 时,关闭浏览器此时数据失效
# 删除/获取Cookie
HttpResponse.delete_cookie(key)
## 删除指定的key的Cookie,如果key不存在则什么也不发生
# 获取Cookies
request.COOKIES.get('Cookie名','默认值')
## 通过request.COOKIES 绑定的字典(dict)获取客户端的COOKIES数据
代码示例
# 浏览器设置一个名为uname的cookie,值是euansu,过期时间为10分钟的cookie
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def set_cookies(request):
response = HttpResponse("set cookies")
response.set_cookie("uname", "euansu", 600)
return response
代码示例
# 浏览器设置一个键为 my_cookie,值为123,过期时间为1个小时的cookie
def set_cookies_new(request):
response = HttpResponse("set cookies")
response.set_cookie("my_cookie", "123", 3600)
return response
# 浏览器修改 my_cookie的值为123,过期时间为2个小时
def update_cookies(request):
response = HttpResponse("update cookies")
response.set_cookie("my_cookie", "456", 7200)
return response
浏览器设置 cookie
浏览器修改 cookie。
代码示例
# 浏览器删除Cookies
def delete_cookies(request):
response = HttpResponse("delete cookies")
response.delete_cookie("my_cookie")
return response
代码示例
# 获取Cookies
def get_cookies(request):
values = request.COOKIES.get("my_cookie", "my_cookie")
return HttpResponse("my_cookie value is {my_cookie}".format(my_cookie=values))
3. session
3.1 session定义
session 是在服务器上开辟一段空间用于保留浏览器和服务器交互时的重要数据。
实现方式:
-
使用 session 需要在浏览器客户端启动 cookie,且在cookie中存储sessionid。
-
每个客户端都可以在服务器端有一个独立的session。
-
注意:不同的请求者之间不会共享这个数据,与请求者一一对应。
3.2 session初始配置
settings.py
中配置 session
。
-
向 INSTALLED_APPS 列表中添加:
INSTALLED_APPS = [ ... # 启用 sessions 应用 'django.contrib.sessions', ]
-
向 MIDDLEWARE 列表中添加:
MIDDLEWARE = [ ... # 启用 session 中间件 'django.contrib.sessions.middleware.SessionMiddleware', ]
3.3 session的使用
session 对象是一个类似于字典的sessionstore类型的对象,可以用类拟于字典的方式进行操作。
session 能够存储如字符串、整型、字典、列表等。
-
保存 session 的值到服务器。
request.session['key'] = value
-
获取 session 的值。
value = request.session['key'] vakue = request.session.get('key', 默认值)
-
删除 session。
del request.session['key']
代码示例
# 设置session
def set_session(request):
request.session['uname'] = 'euansu'
return HttpResponse("set session is ok!")
代码示例
# 获取session
def get_session(request):
value = request.session.get("uname", "")
return HttpResponse("session unmae values is {value}".format(value=value))
代码示例
# 修改session
def update_session(request):
request.session['uname'] = '南歌'
return HttpResponse("update session is ok!")
代码示例
# 删除session
def delete_session(request):
del request.session["uname"]
return HttpResponse("delete session is ok!")
3.4 session相关配置项
-
SESSION_COOKIE_AGE
作用:指定 sessionid 在 cookies 中的保存时长(默认是两周),如下:
SESSION_COOKIE_AGE = 60*60*24*7*2
-
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
设置只要浏览器关闭时,session就失效(默认为False)
注意:Django 中的session数据存储在数据库中,所以使用session前需要确保已经执行migrate。
3.5 Django session的问题
-
django_session 表是单表设计,且该表数据量持续增持(浏览器故意删掉sessionid&过期数据未删除)。
-
可以每晚执行 python3 manage.py clearsessions,该命令可以删除已过期的session数据。