Django | cookie 和 session

204 阅读2分钟

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值会有什么变化?

  1. 会生成一个随机字符串
  2. 会把用户设置的信息保存在Django_session表中,数据也自动做了加密处理
  3. 把数据封装到了request.session里面去了
  4. Django后端把随机字符串保存到了浏览器中
  5. 随机字符串保存在浏览器中的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时发生了哪些事情

  1. 浏览器先把sessionid回传到Django后端
  2. Django后端获取到sessionid,然后去数据表中根据session_key查询
  3. 如果查询到了,说明之前已经保存了此数据(登录)过了
  4. 如果查询不到,返回NONE
  5. 查询出来的数据,默认是加密的。Django后端又自动把数据解密,封装到request.session
  6. 所以,以后取值的时候就从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)