0
点赞
收藏
分享

微信扫一扫

13. django中的cookies和session

萧让听雪 2022-02-27 阅读 59

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设置

实现方式:

  1. 使用session需要在浏览器客户端启动cookie,且在cookie中存储sessionid
  2. 每个客户端都可以在服务器端有一个独立的session
  3. 不同的请求者之间不会共享数据,而是与请求者一一对应

settings.py配置session

  1. 向INSTALLED_APPS列表中添加(默认启用)
# 启用session应用
'django.contrib.sessions',
  1. 向MIDDLEWARE列表中添加(默认启用)
'django.contrib.sessions.middleware.SessionMiddleware',

session的使用

session 对于像是一个类似字典的SessionStore类型的对象,用操作字典的方式操作。

session 能够存储 字符串 整型 字典 列表等

  1. 保存session 的值到服务器
    request.session[‘KEY’]=VALUE
  2. 获取session的值
    value = request.session[‘KEY’]
    value = request.session[‘KEY’,默认值] #推荐这种,即使没有也不会报错
  3. 删除session
    del request.session[‘KEY’]

settings.py 中相关配置项

  1. session_cookie_age
    作用:指定session在cookies中的保存时长(默认是2周)
    SESSION_COOKIE_AGE=60602472

  2. 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 的问题

  1. Django_session 表示单表涉及,且该表数据量持续增持【即使到了过期时间,表中也不会清理数据; 或者手工删掉浏览器中的sessionid,表中数据也不会清理】
  2. 可以每晚执行python manage.py clearsessions [该命令可以删除已过期的session数据]

cookies和session对比

在这里插入图片描述

举报

相关推荐

0 条评论