Django 注销后记住了当前时区



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

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

我有

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 语句?

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

可能在步骤 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?

相关内容

  • 没有找到相关文章

最新更新