2012-09-19 205 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() 

但真正的問題你應該問自己,我認爲是:
爲什麼使用請求。會話如果你不想使用會話,而純粹是配置文件?