Django设置会话变量直到当天结束
我需要设置一个会话变量,这个变量在每天结束时会过期。
我知道我可以这样设置一个会话变量:
request.session['my_variable'] = 'foo'
那么我该如何让它在每天结束时过期呢?
4 个回答
1
就像上面其他回复那样,不过我希望这个更好一点,没有错误。这样你就可以只用一个变量,在5分钟后过期:
from datetime import datetime, timedelta
def set_expirable_var(session, var_name, value, expire_at):
session[var_name] = {'value': value, 'expire_at': expire_at.timestamp()}
def get_expirable_var(session, var_name, default=None):
var = default
if var_name in session:
my_variable_dict = session.get(var_name, {})
if my_variable_dict.get('expire_at', 0) > datetime.now().timestamp():
var = my_variable_dict.get('value')
else:
del session[var_name]
return var
当你需要读取或者保存这个变量的结果时,可以使用:
sum = get_expirable_var(request.session, 'sum', None)
if sum is None:
sum = 4 + 5
expire_at = datetime.today() + timedelta(minutes=5)
set_expirable_var(request.session, 'sum', sum, expire_at)
2
我将提到这个回答。与其把数据直接存储在会话里,不如把它存储在缓存中,并与会话ID关联起来。
from django.core.cache import cache
cache.set(f'{request.session.session_key}_my_variable', value, seconds_until_end_of_day)
上面的回答适合存储少量数据,但如果数据量很大,其实希望在过期后能自动删除。这时缓存就能帮忙处理这个问题。
另外,上面的回答还有一个限制,就是存储在会话里的数据必须能转换成JSON格式,但在缓存中可以存储任何类型的数据(比如字节数组)。
4
在大多数情况下,你并不想让整个会话失效。所以有一种方法可以只让某一个变量失效——把这个变量放在一个字典里,并设置它的过期时间。
def set_expirable_var(session, var_name, value, expire_at):
session[var_name] = {'value': value, 'expire_at': expire_at.timestamp()}
使用这个函数来设置变量:
expire_at = datetime.datetime.combine(datetime.date.today(), datetime.datetime.max.time())
set_expirable_var(request.session, expire_at)
在你获取这个变量的值之前,应该先检查一下这个变量是否已经过期。
def get_expirable_var(session, var_name, default=None):
var = default
if var_name in session:
my_variable_dict = session.get(var_name, {})
if my_variable_dict.get('expire_at', 0) > datetime.datetime.now().timestamp():
myvar = my_variable_dict.get('value')
else:
del session[var_name]
return var
1
你可以设置整个会话在一天结束时过期,方法是使用
request.session.set_expiry(seconds_until_end_of_day)
或者你也可以通过设置来为你应用中的所有会话 cookie 设置一个默认的过期时间,具体的设置是
SESSION_COOKIE_AGE
这个时间也是以秒为单位。如果你确实需要为某个特定的 cookie 设置一个特殊的过期时间,那你可能需要查看一下会话后端的相关内容。