django设置会话变量直到一天结束

时间:2014-08-21 17:41:05

标签: python django session cookies session-variables

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

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

request.session['my_variable'] = 'foo'

我怎么能在一天结束时过期?

4 个答案:

答案 0 :(得分:2)

您可以使用

将整个会话设置为在一天结束时到期
request.session.set_expiry(seconds_until_end_of_day)

或者您可以使用设置

为应用中的所有会话Cookie设置默认过期时间
SESSION_COOKIE_AGE

再过几秒钟。如果您绝对需要设置特定的Cookie以使其具有特殊的过期时间,那么您可能需要查看session backend

答案 1 :(得分:0)

在大多数情况下,您不想使整个会话期满。因此,有一种方法可以仅使一个变量到期-将变量和到期时间一起保存在字典中。

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

答案 2 :(得分:0)

就像上面的其他答复一样,但要好一些并且没有错误(我希望如此)。 这样,您只有一个变量会在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)

答案 3 :(得分:0)

我将提到this answer。可以将数据存储在缓存中并链接到会话 ID,而不是将数据存储在会话本身中。

from django.core.cache import cache
cache.set(f'{request.session.session_key}_my_variable', value, seconds_until_end_of_day)

上述答案适用于少量数据,但如果数据很大,人们实际上希望在到期后将其删除。缓存会处理这个问题。

上述答案的另一个限制是存储在会话中的数据需要是 JSON 可序列化的,但任何数据都可以存储在缓存中(例如字节数组)。