Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.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
Django当前时区在注销后被记住_Django_Timezone - Fatal编程技术网

Django当前时区在注销后被记住

Django当前时区在注销后被记住,django,timezone,Django,Timezone,用户注销后,Django似乎记得上次激活的时区 用户在解释为UTC的表单上发布表单-日期时间 用户使用澳大利亚/悉尼的首选时区登录 用户在解释为澳大利亚/悉尼的表单上发布表单-日期时间 用户注销 用户发布表单-表单上的datetime仍然解释为澳大利亚悉尼,即使时区设置为UTC 重新启动服务器,然后用户(仍未登录)在解释为UTC的表单上发布表单-日期时间 我有 TIME_ZONE = 'UTC' USE_TZ = True 作为中间件: class TimezoneMiddleware(obj

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

  • 用户在解释为UTC的表单上发布表单-日期时间
  • 用户使用澳大利亚/悉尼的首选时区登录
  • 用户在解释为澳大利亚/悉尼的表单上发布表单-日期时间
  • 用户注销
  • 用户发布表单-表单上的datetime仍然解释为澳大利亚悉尼,即使时区设置为UTC
  • 重新启动服务器,然后用户(仍未登录)在解释为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
    

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

    首先,session!=认证

    可能在步骤2和步骤4之间(当用户登录时),您的一个视图(或某种中间件)使用
    request.session['django\u timezone']=…

    也许您可以通过以下方式将配置文件信息传输到会话的某个位置:

    request.session['django_timezone']  = request.user.get_profile().prefferedTimezone
    
    然后,即使用户注销,会话也会保持“django_时区”,这是很自然的

    如果你不想利用这一点,那么首先应该:

    if not request.user.is_authenticated():
        timezone.deactivate()
    
    但我认为你应该问自己的真正问题是:
    如果您不想使用会话,而只想使用概要文件,为什么要使用request.session