Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django将会话变量设置到一天结束_Python_Django_Session_Cookies_Session Variables - Fatal编程技术网

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

Python django将会话变量设置到一天结束,python,django,session,cookies,session-variables,Python,Django,Session,Cookies,Session Variables,我需要设置一个会话变量,该变量在每天结束时过期 我知道我可以设置如下会话变量: request.session['my_variable'] = 'foo' 然后,如何让该会话在一天结束时过期?您可以使用将整个会话设置为在一天结束时过期 request.session.set_expiry(seconds_until_end_of_day) 或者,您可以使用该设置为应用程序中的所有会话cookie设置默认过期时间 SESSION_COOKIE_AGE 再过几秒钟。如果您确实需要将特定coo

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

我知道我可以设置如下会话变量:

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

然后,如何让该会话在一天结束时过期?

您可以使用将整个会话设置为在一天结束时过期

request.session.set_expiry(seconds_until_end_of_day)
或者,您可以使用该设置为应用程序中的所有会话cookie设置默认过期时间

SESSION_COOKIE_AGE

再过几秒钟。如果您确实需要将特定cookie设置为具有特殊过期,那么您可能需要查看。在大多数情况下,您不希望使整个会话过期。因此,有一种方法可以只使一个变量过期—将变量保存在字典中,并注明过期时间

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

就像上面的另一个回答一样,但是更好一点,没有错误(我希望如此)。 这样,只有一个变量在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)
我将提到。数据可以存储在缓存中并链接到会话ID,而不是存储在会话本身中

from django.core.cache import cache
cache.set(f'{request.session.session_key}_my_variable', value, seconds_until_end_of_day)
上述答案适用于少量数据,但如果数据很大,人们实际上希望在到期后将其删除。缓存会处理这个问题


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

这实际上回答了这个问题。