2012-06-28 6 views
6

django.conf में देख रहे हैं मैंने देखा है कि सेटिंग्स इस तरह लागू किया जाता है:django की सेटिंग्स LazyObject क्यों ऑब्जेक्ट करती है?

class LazySettings(LazyObject):  
... 

क्या कर रही सेटिंग्स के पीछे तर्क आलसी वस्तुओं है?

उत्तर

7

Django कोडिंग शैली के this section देखें। कारण वहां बताया गया है (नीचे उद्धृत)।

प्रदर्शन के अतिरिक्त, तृतीय-पक्ष मॉड्यूल आयात किए जाने पर सेटिंग्स को संशोधित कर सकते हैं। इस कॉन्फ़िगरेशन को पहले सुनिश्चित करने के लिए सेटिंग्स तक पहुंचने में देरी होनी चाहिए।

मॉड्यूल सामान्य उपयोग सेटिंग में शीर्ष स्तर पर django.conf.settings में संग्रहीत नहीं करना चाहिए (अर्थात का मूल्यांकन जब मॉड्यूल आयात किया जाता है)। इस के लिए विवरण इस प्रकार है:

सेटिंग्स के मैनुअल विन्यास (यानी DJANGO_SETTINGS_MODULE वातावरण चर पर निर्भर नहीं) की अनुमति और संभव निम्नानुसार है:

from django.conf import settings 

settings.configure ({}, SOME_SETTING = 'foo') हालांकि, अगर सेटिंग 0 कॉन्फ़िगरेशन लाइन से पहले एक्सेस की गई है, तो यह काम नहीं करेगा। (आंतरिक रूप से, सेटिंग्स एक LazyObject है जो स्वचालित रूप से को कॉन्फ़िगर करती है जब सेटिंग्स का उपयोग किया जाता है यदि यह पहले से ही कॉन्फ़िगर नहीं किया गया है)।

तो, अगर वहाँ एक मॉड्यूल के रूप में निम्नानुसार कुछ कोड युक्त है:

from django.conf import settings 
from django.core.urlresolvers import get_callable 

default_foo_view = get_callable(settings.FOO_EXAMPLE_VIEW) 

... तो इस मॉड्यूल का आयात सेटिंग्स विन्यस्त किया जा आपत्ति का कारण होगा। का अर्थ है कि शीर्ष स्तर पर मॉड्यूल आयात करने की तीसरी पार्टियों की क्षमता ऑब्जेक्ट को मैन्युअल रूप से कॉन्फ़िगर करने की क्षमता के साथ असंगत है, या कुछ परिस्थितियों में इसे बहुत मुश्किल बनाती है।

ऊपर कोड की बजाय, आलस्य या अविवेक का एक स्तर इस्तेमाल किया जाना चाहिए, इस तरह के रूप django.utils.functional.LazyObject, django.utils.functional.lazy() या lambda

3

यह एक प्रॉक्सी ऑब्जेक्ट है जो वास्तविक सेटिंग्स फ़ाइलों को सारणीबद्ध करता है, और जब तक आप वास्तव में इच्छित सेटिंग्स तक पहुंच नहीं पाते हैं, तब तक यह हल्का वजन बनाता है। एक बार जब आप गुणों तक पहुंच शुरू कर देते हैं, तो यह मांग पर लोड हो जाएगा। विचार तब तक लोडिंग सेटिंग्स में ओवरहेड को कम करना है जब तक आपको उनकी आवश्यकता न हो।

+3

क्या उद्देश्य वास्तव में ओवरहेड को कम करना है? मेरा मतलब है, आपको स्पष्ट रूप से सेटिंग्स फ़ाइल * अंततः लोड करने की आवश्यकता होगी *, मैं किसी भी django प्रोजेक्ट की कल्पना नहीं कर सकता जो ऐसा नहीं करेगा, इसलिए यह लोडिंग में देरी के लिए व्यर्थ लगता है, आप शुरुआत में भी कर सकते हैं। –

0

मुझे लगता है कि उद्देश्य डेवलपर्स के दृष्टिकोण से सेटिंग्स को सरल बनाना है। इसलिए प्रत्येक प्रोजेक्ट में अन्य सभी Django सेटिंग्स को परिभाषित करने की आवश्यकता के बिना अपनी सेटिंग्स.py फ़ाइल हो सकती है। LazySettings रैपर प्रकार Django global_settings.py और आपकी स्थानीय सेटिंग्स से सबकुछ जोड़ता है। यह डेवलपर को यह तय करने देता है कि वह कौन सी सेटिंग्स को ओवरराइट करना चाहता है, जिसे वह डिफ़ॉल्ट रखना चाहते हैं या जिसे वह जोड़ना चाहता है।

LazySettings कक्षा शायद इसके लिए गलत नाम है, क्योंकि मुझे लगता है कि यह वास्तव में आलसी नहीं है। एक बार जब आप from django.conf import settings जैसे कुछ करते हैं तो संपूर्ण सेटिंग्स ऑब्जेक्ट आपके दायरे में है।

संबंधित मुद्दे