Django
समय क्षेत्र
खोज…
परिचय
Timezones अक्सर डेवलपर्स के लिए एक परेशानी है। Django अपने निपटान में कुछ बेहतरीन उपयोगिताओं प्रदान करता है ताकि टाइमज़ोन के साथ काम करना आसान हो सके।
भले ही आपका प्रोजेक्ट एक ही समय क्षेत्र में चल रहा हो, फिर भी दिन के उजाले की बचत के मामलों को संभालने के लिए अपने डेटाबेस में यूटीसी के रूप में डेटा स्टोर करना अच्छा है। यदि आप कई टाइमज़ोन पर काम कर रहे हैं तो यूटीसी के रूप में समय डेटा संग्रहीत करना आवश्यक है।
समय क्षेत्र समर्थन सक्षम करें
सबसे पहले, यह सुनिश्चित करें कि USE_TZ = True आपकी settings.py में USE_TZ = True है। TIME_ZONE जैसे TIME_ZONE='UTC' लिए एक डिफ़ॉल्ट समय क्षेत्र मान भी सेट करें। यहां टाइमज़ोन की एक पूरी सूची देखें।
यदि USE_TZ गलत है, तो TIME_ZONE वह समय क्षेत्र होगा जो Django सभी USE_TZ को संग्रहीत करने के लिए उपयोग करेगा। जब USE_TZ सक्षम होता है, TIME_ZONE डिफ़ॉल्ट समय क्षेत्र है जो Django टेम्पलेट्स में USE_TZ प्रदर्शित करने और रूपों में दर्ज किए गए USE_TZ की व्याख्या करने के लिए उपयोग करेगा।
समय क्षेत्र समर्थन सक्षम होने के साथ, django डेटाबेस में डेटा datetime को UTC रूप में संग्रहीत करेगा
सत्र टाइमज़ोन की स्थापना
पायथन के datetime.datetime वस्तुओं में एक tzinfo विशेषता है जो समय क्षेत्र की जानकारी संग्रहीत करने के लिए उपयोग की जाती है। जब विशेषता सेट की जाती है तो वस्तु को Aware माना जाता है, जब विशेषता सेट नहीं होती है तो इसे Naive माना जाता है।
यह सुनिश्चित करने के लिए कि एक समय क्षेत्र भोला या जागरूक है, आप .is_naive() और .is_aware() उपयोग कर सकते हैं।
यदि आपके पास USE_TZ अपने में सक्षम settings.py फ़ाइल, एक datetime समय क्षेत्र में लंबे समय के रूप में इसे से जुड़ी जानकारी होगी के रूप में अपने डिफ़ॉल्ट TIME_ZONE में सेट है 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__ हम __call__ डेटा की सेटिंग को संभाल रहे हैं। पहले हम यह सुनिश्चित करते हैं कि उपयोगकर्ता प्रमाणित है, यह सुनिश्चित करने के लिए कि हमारे पास इस उपयोगकर्ता के लिए समय क्षेत्र डेटा है। एक बार जब हम जानते हैं कि हम कर लेते हैं, तो हम timezone.activate() का उपयोग करके उपयोगकर्ता सत्र के लिए टाइमज़ोन को सक्रिय करते हैं। टाइम ज़ोन स्ट्रिंग को परिवर्तित करने के लिए हमें pytz.timezone(str) द्वारा प्रयोग करने योग्य कुछ करना होगा, हम pytz.timezone(str) उपयोग करते हैं।
अब, जब डेटाटाइम ऑब्जेक्ट्स को टेम्प्लेट में एक्सेस किया जाता है, तो वे डेटाबेस के 'UTC' प्रारूप से स्वचालित रूप से परिवर्तित हो जाएंगे, उपयोगकर्ता जिस भी समय क्षेत्र में है, बस डेटाइम ऑब्जेक्ट तक पहुँचें और इसका टाइमज़ोन सेट किया जाएगा मानकर पिछले मिडलवेयर सेट किया गया है। ठीक से।
{{ 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 में देखें