設定會話時區
Python 的 datetime.datetime
物件具有 tzinfo
屬性,用於儲存時區資訊。設定屬性時,物件被視為 Aware,當未設定屬性時,它被視為 Naive。
為確保時區天真或有意識,你可以使用 .is_naive()
和 .is_aware()
如果你的 settings.py
檔案中啟用了 USE_TZ
,只要你的預設 TIME_ZONE
設定在 settings.py
中,datetime
就會附加時區資訊
雖然此預設時區在某些情況下可能會很好,但可能還不夠,尤其是在處理多個時區的使用者時。為了實現這一點,必須使用中介軟體。
import pytz
from django.utils import timezone
# make sure you add `TimezoneMiddleware` appropriately in settings.py
class TimezoneMiddleware(object):
"""
Middleware to properly handle the users timezone
"""
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# make sure they are authenticated so we know we have their tz info.
if request.user.is_authenticated():
# we are getting the users timezone that in this case is stored in
# a user's profile
tz_str = request.user.profile.timezone
timezone.activate(pytz.timezone(tz_str))
# otherwise deactivate and the default time zone will be used anyway
else:
timezone.deactivate()
response = self.get_response(request)
return response
還有一些新事物正在發生。要了解有關中介軟體及其功能的更多資訊,請檢視該部分文件 。在 __call__
中,我們正在處理時區資料的設定。首先,我們確保使用者已通過身份驗證,以確保我們為此使用者提供時區資料。一旦我們知道了,我們就會使用 timezone.activate()
為使用者會話啟用時區。為了將時區字串轉換為 datetime 可用的時區,我們使用 pytz.timezone(str)
。
現在,當在模板中訪問 datetime 物件時,它們將自動從資料庫的 UTC
格式轉換為使用者所在的任何時區。只需訪問 datetime 物件,並假設先前的中介軟體已設定,將設定其時區正常。
{{ my_datetime_value }}
如果你希望對使用者的時區是否使用進行細粒度控制,請檢視以下內容:
{% load tz %}
{% localtime on %}
{# this time will be respect the users time zone #}
{{ your_date_time }}
{% endlocaltime %}
{% localtime off %}
{# this will not respect the users time zone #}
{{ your_date_time }}
{% endlocaltime %}
注意,此方法描述僅適用於 Django 1.10 及更高版本。要從 1.10 之前支援 django,請檢視 MiddlewareMixin