Django设置会话变量直到当天结束

4 投票
4 回答
3750 浏览
提问于 2025-04-18 18:06

我需要设置一个会话变量,这个变量在每天结束时会过期。

我知道我可以这样设置一个会话变量:

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 设置一个特殊的过期时间,那你可能需要查看一下会话后端的相关内容。

撰写回答