Session简介
session的数据是保存在后端。保存在后端的载体有很多种,比如:可以把数据保存在数据库、文件、Redis等
Django的默认保存卫视在数据库中,在Django_session表中,这张表是默认生成的。
该如何操作Session
设置Session
views.py
# session 相关
def set_session(request):
request.session['username'] = 'JJ'
return HttpResponse('set_session')
urls.py
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
# session相关
path('set_session/', views.set_session),
]
session_key: mxsx915mbm23n0x5dgf5m2nn2bnxw2ps,
session_data: eyJ1c2VybmFtZSI6IkpKIn0:1qU0a5:3TqnCXf-G_RRq8Q__ObRbN3AH-OGUQJXo-YMiriW9bs,
expire_date: 2023-08-24 07:59:41.367072
设置成功一个Session值会有什么变化?
- 会生成一个随机字符串
- 会把用户设置的信息保存在Django_session表中,数据也自动做了加密处理
- 把数据封装到了request.session里面去了
- Django后端把随机字符串保存到了浏览器中
- 随机字符串保存在浏览器中的key=sessionid中
当设置多个session值的时候,session_key是不变的,更新的是session_data,django_session表中只存在一条记录。(进针对一个浏览器,如果换一个浏览器又是一条)
上述做法有什么好处? 节省MySQL的空间,不会让数据增加的过快。
获取session
def get_session(request):
print(request.session.get('username'))
print(request.session.get('password'))
return HttpResponse('get_session')
path('get_session/', views.get_session),
读取出来后,自动解密
[10/Aug/2023 08:16:26] "GET /get_session/ HTTP/1.1" 200 11
JJ
JJz123abc
获取session时发生了哪些事情
- 浏览器先把sessionid回传到Django后端
- Django后端获取到sessionid,然后去数据表中根据session_key查询
- 如果查询到了,说明之前已经保存了此数据(登录)过了
- 如果查询不到,返回NONE
- 查询出来的数据,默认是加密的。Django后端又自动把数据解密,封装到
request.session中 - 所以,以后取值的时候就从
request.session中取
设置过期时间expire_date
session的默认过期时间是14天
request.session.set_expiry(60 * 30)
清空cookies
obj.delete_cookie('username) # 常用---退出登录、注销
清空session
def del_session(request):
request.session.delete() # 清空session(只能删除服务端数据,保留浏览器数据)
request.session.flush() # 清空所有
return HttpResponse('del_session')
path('del_session/', views.del_session)