用户退出后,Django似乎记得上次激活的时区。
我有
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语句?
答案 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?