Looking for django Keywords? Try Ask4Keywords

Django Sessietijdzones instellen


Voorbeeld

Python's datetime.datetime objecten hebben een tzinfo kenmerk dat wordt gebruikt om tijdzone-informatie op te slaan. Wanneer het attribuut is ingesteld, wordt het object als Bewust beschouwd, wanneer het attribuut niet wordt ingesteld, wordt het als Naïef beschouwd.

Om ervoor te zorgen dat een tijdzone naïef of bewust is, kunt u .is_naive() en .is_aware()

Als USE_TZ ingeschakeld in uw bestand settings.py , wordt aan een datetime tijdzone-informatie gekoppeld zolang uw standaard TIME_ZONE is ingesteld in settings.py

Hoewel deze standaardtijdzone in sommige gevallen goed kan zijn, is dit waarschijnlijk niet voldoende, vooral als u gebruikers in meerdere tijdzones behandelt. Om dit te bereiken, moet middleware worden gebruikt.

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

Er zijn een paar nieuwe dingen aan de hand. Bekijk dat deel van de documentatie voor meer informatie over middleware en wat het doet. In __call__ we de instelling van de tijdzonegegevens. In eerste instantie zorgen we ervoor dat de gebruiker wordt geverifieerd, om ervoor te zorgen dat we tijdzonegegevens voor deze gebruiker hebben. Zodra we weten dat we dat doen, activeren we de tijdzone voor de gebruikerssessie met timezone.activate() . Om de tijdzonereeks te converteren naar iets dat bruikbaar is door datetime, gebruiken we pytz.timezone(str) .

Wanneer nu datetime-objecten in sjablonen worden benaderd, worden ze automatisch geconverteerd van het 'UTC'-formaat van de database naar de tijdzone waarin de gebruiker zich bevindt. Ga gewoon naar het datetime-object en de tijdzone wordt ingesteld, ervan uitgaande dat de vorige middleware is ingesteld naar behoren.

{{ my_datetime_value }}

Als u een nauwkeurige controle wenst over het gebruik van de tijdzone van de gebruiker, kijk dan naar het volgende:

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

Let op, deze beschreven methode werkt alleen in Django 1.10 en hoger. Om django van vóór 1.10 te ondersteunen, kijk in MiddlewareMixin