2012-09-19 76 views
0

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

  1. 用户讯息形成 - 对形式的日期时间解释为UTC
  2. 用户登录与澳大利亚/悉尼的优选时区
  3. 用户讯息形成 - 上解释为澳大利亚/悉尼形式日期时间
  4. 用户注销
  5. 用户帖子窗体上的datetime仍然被解释为澳大利亚悉尼,尽管TIME_ZONE设置为UTC
  6. 重新启动服务器,然后用户(仍未登录)发布表单 - datetime on form inte rpreted为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

首先,session!=认证。

第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() 

但真正的问题你应该问自己,我认为是:
为什么使用请求。会话如果你不想使用会话,而纯粹是配置文件?