登出后记住Django当前时区

时间:2012-09-19 13:04:39

标签: django timezone

用户退出后,Django似乎记得上次激活的时区。

  1. 用户发布表单 - 表单上的日期时间解释为UTC
  2. 用户使用澳大利亚/悉尼首选时区登录
  3. 用户发布表单 - 表格上的日期时间解释为澳大利亚/悉尼
  4. 用户退出
  5. 用户发布表单 - 表单上的日期时间仍被解释为澳大利亚悉尼,即使TIME_ZONE设置为UTC
  6. 重新启动服务器,然后用户(仍然没有登录)发布表格 - 日期时间在表格上解释为UTC
  7. 我有

    TIME_ZONE = 'UTC'
    USE_TZ = True
    

    和中间件:

    class TimezoneMiddleware(object):
        def process_request(self, request):
    
            tz = request.session.get('django_timezone', '')
            if tz:
                timezone.activate(tz)
            elif request.user.is_authenticated():
                preferredTimezone = request.user.get_profile().preferredTimezone
                timezone.activate(preferredTimezone)
    

    我认为Django可能会记住上一次激活的时区,如源代码中activate函数的评论所示:

    def activate(timezone):
        """
        Sets the time zone for the current thread.
    
        The ``timezone`` argument must be an instance of a tzinfo subclass or a
        time zone name. If it is a time zone name, pytz is required.
        """
        if isinstance(timezone, tzinfo):
            _active.value = timezone
    

    有人可以证实吗?解决这个问题的最佳方法是,在中间件中,是否有一个调用deactivate的else语句?

1 个答案:

答案 0 :(得分:2)

首先,会话!=身份验证。

可能在步骤2和4之间(当用户登录时),您的一个视图(或某种中间件)将用户的会话设置为request.session['django_timezone'] = ...

也许您将个人资料信息转移到某个地方的会话中,例如:

request.session['django_timezone']  = request.user.get_profile().prefferedTimezone

然后,很自然,即使用户退出,会话也会保留'django_timezone'。

如果您不想利用这一点,请首先选择:

if not request.user.is_authenticated():
    timezone.deactivate()

但是我认为你应该问自己的真正问题是:
如果您不想使用会话,而不是纯粹的个人资料,为什么要使用request.session?