Looking for django Keywords? Try Ask4Keywords

Django Sitzungszeitzonen einstellen


Beispiel

Die datetime.datetime Objekte von Python datetime.datetime über ein tzinfo Attribut, das zum Speichern von Zeitzoneninformationen verwendet wird. Wenn das Attribut gesetzt ist, wird das Objekt als "Aware" betrachtet. Wenn das Attribut nicht festgelegt ist, wird es als "Naive" betrachtet.

Um sicherzustellen, dass eine Zeitzone naiv oder bewusst ist, können Sie .is_naive() und .is_aware()

Wenn Sie USE_TZ in Ihrer Datei " settings.py datetime haben, werden an eine datetime Zeitzoneninformationen angehängt, solange Ihr Standardwert TIME_ZONE in " settings.py

Obwohl diese Standardzeitzone in einigen Fällen gut sein kann, reicht sie wahrscheinlich nicht aus, insbesondere wenn Sie Benutzer in mehreren Zeitzonen verwalten. Um dies zu erreichen, muss Middleware verwendet werden.

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

Es gibt ein paar neue Dinge. Um mehr über Middleware und deren Funktionen zu erfahren, lesen Sie diesen Teil der Dokumentation . In __call__ wir die Einstellung der Zeitzonendaten. Zuerst stellen wir sicher, dass der Benutzer authentifiziert ist, um sicherzustellen, dass für diesen Benutzer Zeitzonen-Daten vorliegen. Sobald wir wissen, dass wir dies tun, aktivieren wir die Zeitzone für die Benutzersitzung mit timezone.activate() . Um den Zeitzonen-String in etwas umzuwandeln, das von datetime verwendet werden kann, verwenden wir pytz.timezone(str) .

Wenn jetzt auf datetime-Objekte in Vorlagen zugegriffen wird, werden diese automatisch vom UTC-Format der Datenbank in die Zeitzone des Benutzers konvertiert. Greifen Sie einfach auf das datetime-Objekt zu, und seine Zeitzone wird festgelegt, sofern die vorherige Middleware eingerichtet ist richtig.

{{ my_datetime_value }}

Wenn Sie eine genaue Kontrolle darüber wünschen, ob die Zeitzone des Benutzers verwendet wird, sehen Sie sich Folgendes an:

{% 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 %}

Beachten Sie, dass diese beschriebene Methode nur in Django 1.10 und mehr funktioniert. Um Django von vor 1.10 zu unterstützen, schauen Sie in MiddlewareMixin nach