Looking for django Keywords? Try Ask4Keywords

Django 設置會話時區


Python的datetime.datetime對象具有tzinfo屬性,用於存儲時區信息。設置屬性時,對像被視為Aware,當未設置屬性時,它被視為Naive。

要確保時區天真或有意識,您可以使用.is_naive().is_aware()

如果您在settings.py文件中啟用了USE_TZ ,則只要在settings.pysettings.py默認的TIME_ZONEdatetime時間就會附加時區信息。

雖然此默認時區在某些情況下可能會很好,但可能還不夠,尤其是在處理多個時區的用戶時。為了實現這一點,必須使用中間件。

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()激活用戶會話的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