cookie 和 session
保持会话状态,记录登录浏览等信息
从打开浏览器访问一个网站,到关闭浏览器结束此次访问,称之为一次会话
http协议是无状态的,导致会话难以保持
cookie 和 session就是为了保持会话状态而诞生的两个存储技术
cookies
cookies - 定义
cookies 是保存在客户端浏览器上的存储空间
cookies - 特点
1. cookies 在浏览器是以键值对的形式存储,可把它当做字典,键和值都是以ascii字符串形式存储
2. 存储的数据带有生命周期
Expires / Max-Age:"Sat, 18 Feb 2023 03:42:31 GMT"
3. cookies中的数据是按域存储隔离,不同的域之间无法访问
4. cookies的内部的数据会在每次访问此网址时都会携带到服务器端,如果cookies过大会降低响应速度
cookies的使用 - 设置
可以使用HttpResponse.set_cookie 设置cookie
HttpResponse.set_cookie(key,value='',max_age=None,expires=None)
key: cookie的名字
values: coolie的值
max_age: cookie的存活时间,秒为单位
expires: 具体过期时间
当不指定max_age 和 expires时,关闭浏览器此时数据失效
路由
path('set_cookies/',views.set_cookies)
视图层
def set_cookies(request):
from django.http import HttpResponse, HttpResponseRedirect
resp = HttpResponse('set coolies is ok')
resp.set_cookie("hello","world",200)
return resp
存储示例:
添加cookie
def set_cookies(request):
resp = HttpResponse("已添加 my_var1,值为123")
# 为浏览器添加键为my_var1,值为123,过期时间为1个小时的cookie
resp.set_cookie("my_var1",123,3600)
return resp
修改cookie
# 为浏览器添加键为my_var1的值修改为456,过期时间为2个小时的cookie
resp = HttpResponse("修改 my_var1,值为456")
resp.set_cookie("my_var1",456,3600*2)
return resp
删除cookies
HttpResponse.delete_cookie(key)
删除指定key的cookie,如果key不存在则忽略
获取cookie
通过request.Cookies绑定的字典获取客户端cookies数据
value=request.COOKIES.get(‘cookie名’,‘默认值’)
def get_cookies(request):
value=request.COOKIES.get("my_var1")
return HttpResponse('cookies is %s'%value)
session
session特点
session 是在服务器上开辟(django是数据库内)一段空间用于保留浏览器和服务器交互时的重要数据
session设置
实现方式:
- 使用session需要在浏览器客户端启动cookie,且在cookie中存储sessionid
- 每个客户端都可以在服务器端有一个独立的session
- 不同的请求者之间不会共享数据,而是与请求者一一对应
settings.py配置session
- 向INSTALLED_APPS列表中添加(默认启用)
# 启用session应用
'django.contrib.sessions',
- 向MIDDLEWARE列表中添加(默认启用)
'django.contrib.sessions.middleware.SessionMiddleware',
session的使用
session 对于像是一个类似字典的SessionStore类型的对象,用操作字典的方式操作。
session 能够存储 字符串 整型 字典 列表等
- 保存session 的值到服务器
request.session[‘KEY’]=VALUE - 获取session的值
value = request.session[‘KEY’]
value = request.session[‘KEY’,默认值] #推荐这种,即使没有也不会报错 - 删除session
del request.session[‘KEY’]
settings.py 中相关配置项
-
session_cookie_age
作用:指定session在cookies中的保存时长(默认是2周)
SESSION_COOKIE_AGE=60602472 -
SESSION_EXPIRE_AT_BROWSER_CLOSE=TRUE
设置只要关闭浏览器,session就失效(默认是False)
注意: Django中的session数据存储在数据库中,所以使用session前需要确保已经执行过migrate
mysql> desc django_session;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| session_key | varchar(40) | NO | PRI | NULL | |
| session_data | longtext | NO | | NULL | |
| expire_date | datetime(6) | NO | MUL | NULL | |
+--------------+-------------+------+-----+---------+-------+
3 rows in set (0.04 sec)
mysql> select * from django_session;
+----------------------------------+----------------------------------------------------------------------------------+----------------------------+
| session_key | session_data | expire_date |
+----------------------------------+----------------------------------------------------------------------------------+----------------------------+
| 5rhg0l78xbz136g3axxhobgh1rtp604i | ZmNkZTMzZDExY2M0ZmQ0Mjg1OTZiOTg4ZWI2YzAxNjY4MjkyYjcyZjp7InVuYW1lIjoic2h1Z2UifQ== | 2022-03-04 06:24:20.452528 |
+----------------------------------+----------------------------------------------------------------------------------+----------------------------+
1 row in set (0.01 sec)
Django session 的问题
- Django_session 表示单表涉及,且该表数据量持续增持【即使到了过期时间,表中也不会清理数据; 或者手工删掉浏览器中的sessionid,表中数据也不会清理】
- 可以每晚执行python manage.py clearsessions [该命令可以删除已过期的session数据]