【问题标题】:django set session variable till end of daydjango 设置会话变量直到一天结束
【发布时间】:2014-10-15 10:58:59
【问题描述】:

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

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

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

我怎样才能让这个在一天结束时过期?

【问题讨论】:

    标签: python django session cookies session-variables


    【解决方案1】:

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

    request.session.set_expiry(seconds_until_end_of_day)
    

    或者您可以使用设置为您的应用中的所有会话 cookie 设置默认过期时间

    SESSION_COOKIE_AGE
    

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

    【讨论】:

      【解决方案2】:

      在大多数情况下,您不想让整个会话过期。所以有一种方法可以只使一个变量过期 - 将变量与过期时间一起保存在字典中。

      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
      

      【讨论】:

      • 这实际上回答了这个问题。
      【解决方案3】:

      就像上面的另一个回复一样,但更好一点并且没有错误(我希望)。 这样一来,您只能让一个变量在 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)
      

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2016-11-07
          • 1970-01-01
          • 2012-10-15
          • 2021-07-20
          • 2014-09-27
          • 2013-06-23
          • 1970-01-01
          • 2013-06-02
          • 1970-01-01
          相关资源
          最近更新 更多