Looking for django Keywords? Try Ask4Keywords

Django Ustawianie stref czasowych sesji


Przykład

Obiekty datetime.datetime Pythona mają atrybut tzinfo który służy do przechowywania informacji o strefie czasowej. Kiedy atrybut jest ustawiony, obiekt jest uważany za Świadomy, a gdy atrybut nie jest ustawiony, jest uważany za Naiwny.

Aby upewnić się, że .is_naive() czasowa jest naiwna lub świadoma, możesz użyć .is_naive() i .is_aware()

Jeśli masz USE_TZ włączone w Twojej settings.py plik, datetime będą miały odpowiednią strefę czasową z nim związane jak długo domyślny TIME_ZONE jest ustawiony w settings.py

Chociaż ta domyślna strefa czasowa może być dobra w niektórych przypadkach, prawdopodobnie nie jest wystarczająca, szczególnie jeśli obsługujesz użytkowników w wielu strefach czasowych. Aby to osiągnąć, należy użyć oprogramowania pośredniego.

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

Dzieje się kilka nowych rzeczy. Aby dowiedzieć się więcej na temat oprogramowania pośredniego i jego funkcji, zapoznaj się z tą częścią dokumentacji . W __call__ zajmujemy się ustawieniem danych strefy czasowej. Najpierw upewniamy się, że użytkownik jest uwierzytelniony, aby upewnić się, że mamy dane strefy czasowej dla tego użytkownika. Kiedy wiemy, że tak, aktywujemy strefę czasową dla sesji użytkowników za pomocą timezone.activate() . Aby przekonwertować ciąg strefy czasowej musimy na coś użytecznego przez datetime, używamy pytz.timezone(str) .

Teraz, gdy obiekty datetime są dostępne w szablonach, zostaną one automatycznie przekonwertowane z formatu „UTC” bazy danych na dowolną strefę czasową, w której znajduje się użytkownik. Wystarczy wejść do obiektu datetime, a jego strefa czasowa zostanie ustawiona, zakładając, że skonfigurowano poprzednie oprogramowanie pośrednie prawidłowo.

{{ my_datetime_value }}

Jeśli chcesz precyzyjnie kontrolować, czy strefa czasowa użytkownika jest używana, spójrz na następujące kwestie:

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

Uwaga: opisana metoda działa tylko w Django 1.10 i późniejszych. Aby wesprzeć django sprzed 1.10, zajrzyj do MiddlewareMixin