2010-01-10 9 views
19

जब आप एक नया django अनुप्रयोग स्थापित करते हैं, तो आपको अपने सेटिंग्स.py मॉड्यूल को जोड़ना/संशोधित करना होगा।django settings.py को मॉड्यूलर कैसे करें?

एक परियोजना मुझे लगता है कि मॉड्यूल एक अजगर सबपैकेज बनाने के लिए और प्रत्येक आवेदन के लिए एक मॉड्यूल बनाने के लिए कोशिश कर रहा हूँ के लिए:

settings\ 
    __init__.py 
    base.py 
    admin.py 
    feincms.py 
    ... 

समस्या मैं के साथ settings.py गुण मर्ज करने के लिए कैसे है सामना कर रहा हूँ (INSTALLED_APPS उदाहरण के लिए मूल्यों का एक गुच्छा है) जो विभिन्न submodules में मूल्य प्राप्त कर रहे हैं?

धन्यवाद


ठीक है, मैं गलत सवाल (इसके लिए सही जवाब मिल गया है) के लिए कहा। मेरा सवाल होना चाहिए था, सभी submodules से गुण कैसे प्राप्त करें और उन्हें मर्ज करें? Django सेटिंग्स आयात करेगा और सब कुछ वहाँ होने की उम्मीद है।

+0

जैसा कि अकोहोला ने उल्लेख किया है, आपके समाधान के लिए कोड देखना बहुत अच्छा होगा। धन्यवाद! – ryanjdillon

उत्तर

4

आपको this solution में रुचि हो सकती है; अद्यतन करने के लिए, संशोधित करने, आदि के क्रम है, जहां प्रत्येक फ़ाइल पहले से भरी हुई फाइलों से सेटिंग के लिए पूरा उपयोग किया है में सेटिंग्स फ़ाइलों की एक श्रृंखला लोड करने के लिए, execfile() का उपयोग करता है

+0

हां, मैंने इसी तरह के समाधान को लिखना समाप्त कर दिया। लेकिन execfile() अब निराश है। तो मैंने exec() और संकलन() –

+6

विजेता का उपयोग किया, यह आपके समाधान – akaihola

+0

के लिए कोड देखना दिलचस्प होगा, इसलिए क्षमा करें दोस्तों। यह 3 साल पहले की तरह था और मुझे उस ऐप को याद नहीं है जिस पर मैं काम कर रहा था। लेकिन यह उत्तर मदद कर सकता है: http://stackoverflow.com/a/437857/125560। इन चीजों के साथ अद्यतित होना सुनिश्चित करें। मैं देख रहा हूं कि Python3 –

0

संभावित रूप से "विलय" का सबसे अच्छा तरीका भिन्नता के गुणों के अनुसार भिन्न होता है। उदाहरण के लिए, कई tuples (विभिन्न submodules के INSTALLED_APPS से) दिए गए हैं, तो आप उन्हें एक नए ट्यूपल (INSTALLED_APPS पूरी तरह से पैकेज की विशेषता के लिए) में जोड़ सकते हैं, या यदि संभव हो तो डुप्लिकेशंस एक समस्या है, तो कुछ स्मार्ट डुप्लिकेशंस को हटाएं (इस मामले में आपको ऑर्डर करने की परवाह नहीं है, इसलिए बस tuple(set(tup1+tup2+tup3)) पर्याप्त हो सकता है)।

अन्य मामलों के लिए ("विलय" शब्दकोष, "विलय" सेटिंग्स, जो केवल स्केलर या स्ट्रिंग आदि हैं) आपको विभिन्न रणनीतियों की आवश्यकता होगी (शायद .update शब्दकोशों के लिए कॉल करें, केवल कुछ मानदंडों के अनुसार चुनें स्केलर या तार, आदि, आदि) - मुझे बस यहां काम करने वाला एक "एक आकार फिट बैठता है" दृष्टिकोण नहीं दिख रहा है।

6

"जब आप एक नया django अनुप्रयोग स्थापित करते हैं, तो आपको अपने सेटिंग्स.py मॉड्यूल को जोड़ना/संशोधित करना होगा।"

मुझे लगता है कि यह ठीक है।

मुझे इसे बदलने या संशोधित करने का कोई कारण नहीं दिख रहा है।

हालांकि, हम मुख्य सेटिंग्स मॉड्यूल को "सबक्लास" करना चाहते हैं।

हमारे डेवलपर-विशिष्ट और स्थापना विशिष्ट फ़ाइलें settings_devxy_linux2 और settings_checkout_win32, आदि

इन फ़ाइलों में से प्रत्येक कोर सेटिंग आयात करेगा और एक विशिष्ट स्थापना के लिए ओवरराइड के साथ उन कोर सेटिंग्स का विस्तार करने के from settings import * साथ शुरू होता है जैसे नाम और मंच।

इसे किसी वास्तविक काम की आवश्यकता नहीं है। हालांकि, इसका मतलब यह है कि हम django-admin.py के साथ अधिकांश चीजें करते हैं क्योंकि हमारी सेटिंग्स को settings नहीं कहा जाता है।

+0

तो, क्या ये फ़ाइलें हैं जिन्हें आपने पर्यावरण में 'DJANGO_SETTINGS_MODULE' में निर्दिष्ट किया है? हम विपरीत दिशा की तरह गए: हमारे पास 'settings.py' है लेकिन यह स्थानीय_early_setting.py और local_late_settings.py की कोशिश/शामिल करता है। ये फ़ाइलें विकास से लेकर स्टेजिंग तक भिन्न होती हैं। मूल 'सेटिंग्स.py' में सही उत्पादन मान होते हैं। –

+0

हम उत्पादन के लिए 'settings_prod_linux2' निर्दिष्ट करते हैं; यह मूल 'सेटिंग्स' आयात करता है जो पूरी तरह से परियोजना को परिभाषित करता है। मैं विकास के लिए 'settings_devsl_win32' का उपयोग करता हूं; यह कोर 'सेटिंग्स' आयात करता है। चूंकि यह सरल ओवरराइड है, इसलिए कोई "तर्क" नहीं है। नहीं "अगर", नहीं "कोशिश करें"। –

+0

अच्छा बिंदु। हमें Mercurial से हमारी स्थानीय * सेटिंग्स फ़ाइलों को स्पष्ट रूप से बाहर करना पड़ा ताकि वे आकस्मिक रूप से उत्पादन में समाप्त न हों। विचार के लिए Thanx। –

4

मैं का उपयोग किया है इस काम के आसपास:

settings.py:

INSTALLED_APPS = ('whatever',) 
import more_settings 
more_settings.modify(globals()) 

more_settings।py:

def modify(settings): 
    settings['INSTALLED_APPS'] += ('another_app',) 
+0

के लिए कुछ अन्य विकल्प हैं, यह शायद एकल विरासत को संभालने का सबसे अच्छा तरीका है। अगला कदम वाईएएमएल होगा। – iElectric

0

आप मेरे पिछले more_settings.modify() दृष्टिकोण की तुलना में अधिक जादू पसंद करते हैं, इस प्रयास करें:

settings.py:

INSTALLED_APPS = ('whatever',) 
import more_settings 
more_settings.modify(globals()) 

more_settings.py:

def config(INSTALLED_APPS=(), **other_settings): 
    INSTALLED_APPS += ('another_app',) 
    del other_settings 
    return locals() 

def modify(settings): 
    settings.update(config(**settings)) 

सकारात्मक: dict अंकन के साथ सेटिंग का उल्लेख करने के

विपक्ष की कोई जरूरत नहीं: config()

-1

के लिए kwargs के रूप में सेटिंग को संशोधित को परिभाषित करना होगा बस उर init .py में

from base import * 
from admin import * 
... 

डाल कि ऐसा करना चाहिए काम

मैंने इसे विभिन्न साइटों के लिए उपयोग किया

base/settings.py # common settings: db, apps, ... 
base/sites/website1/settings.py # site_id, custom middleware 
base/sites/website2/settings.py # site_id, custom middleware 

वेबसाइट सेटिंग

from base.settings import * 

के साथ आम सेटिंग आयात करेगा और परिभाषित कस्टम attribtues

1

मैं सेटिंग्स फ़ाइलों का एक ही संरचना है और मैं submodules की सेटिंग आयात करने के लिए निम्न करें:

def load_settings_file(file): 
    file = open(os.path.join(INSTALL_DIR, '<projectname>', 'settings', file + '.py')) 
    content = file.read() 
    file.close() 
    return content 

for submodule in ['base', 'admin', 'feincms']: 
    exec(load_settings_file(submodule)) 
+0

चालाक समाधान! – mattmc3

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