Django中使用session,并设置过期时间

发布时间 2023-04-15 17:03:48作者: 含若飞

Django中session的使用

使用背景

django中自带了一个数据库,名字是djang_session,用户做用户凭证。它有三个字段

session_key session_data expire_data
这个数字会返回给客户端 存储的相关信息 过期时间

流程:
1. 用户首次输入账户名和密码,服务端判断正确之后创建一个sesion的信息,也就是在数据库中添加一条数据,
2. 其中session_key是随机生成的,session_data是服务端手动添加的一些信息,我们可以让它是个对象,也可以是个具体的值,这些都是加密过的。如果不设置过期时间,那么默认是两周,也就是14天,如果想手动设置,可以在settings.py文件下添加SESSION_COOKIE_AGE = 3600 # 1小时 这个字段。
3. 生成的session_key我们通过在响应头中添加Set-Cookie字段,之后客户端会将这个sessin_Key存到服务端。
4.之后每次用户请求时都需要在cookie中携带这个sessino_key,服务端做校验,就达到了持续性会话。

出现问题

我之前使用的就是上述这种方法,采用前后端分离的模式。但是遇到了很多问题。
首先遇到的就是cors跨域问题,如果我们想解决这个跨域问题可以借助django-cors-headers中间件进行处理,用的时候需要注意在settings.py文件中进行注册,同时在中间件配置项中进行更改。
之后还需要在每个视图的响应体中添加相关字段

response = HttpResponse()
# 设置允许使用cookie
response['Access-Control-Allow-Credentials'] = 'true'
response['Access-Control-Allow-Origin'] = '*'
response.set_cookie('sessionid', session_key, max_age=86400)
return response

感觉一切都没有问题了,但是后面在使用时又出现问题了。

前端在接收的响应后,可以得到Set-Cookie字段以及相应的sessoin_Key,但是我们在发送请求设置cookie时却遇到
image
后来又去网上搜索,各种情况,比如客户端添加withCredentials:true,服务端也添加内容,但是似乎都没有解决。

解决办法

采用类似token的方式。也就是客户端在接收到这个session_key之后将数据存到本地存储中,之后每次请求时在请求头中添加Authorization:'Beaner '+session_key,之后服务端就可以获取到请求头中的这个字段并进行校验,也就达到了一个校验的目的。
image

但是sesion和cookie是挂钩的,意思就是,这个不具备过期时间,也就是一直可以获取,解决的办法可以采用下述参考回答:
image

上述代码均由chatGpt生成,感谢chatGpt。