Looking for django Keywords? Try Ask4Keywords

Django セッションのタイムゾーンを設定する


Pythonのdatetime.datetimeオブジェクトには、タイムゾーン情報を格納するために使用されるtzinfo属性があります。属性が設定されている場合、そのオブジェクトは認識されているとみなされます。属性が設定されていない場合は、Naiveとみなされます。

タイムゾーンがナイーブであることを確認するには、 .is_naive().is_aware()使用します。

settings.pyファイルにUSE_TZ有効になっている場合、デフォルトのTIME_ZONEsettings.pyされている限り、 datetimeにタイムゾーン情報が付加されsettings.py

このデフォルトのタイムゾーンは、場合によっては良好な場合がありますが、複数のタイムゾーンでユーザーを処理する場合は、特に不十分な場合があります。これを達成するには、ミドルウェアを使用する必要があります。

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)を使用し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を見てください