2015-05-15 3 views
10

में पूर्वापेक्षाएँ ऐप्स को कैसे शामिल करें मेरे पास एक Django ऐप है जिसे मैं बना रहा हूं, जिसे हम foo पर कॉल करेंगे।INSTALLED_APPS

फ़ू का निर्माण करने के तरीके के कारण, इसे कार्य करने के लिए कई तृतीय-पक्ष django ऐप्स की आवश्यकता होती है। उदाहरण के लिए, Foo चलाने एक स्थापित करने के लिए क्षुधा दिखाई देंगे:

INSTALLED_APPS = ('prereq1',prereq2','foo') 

वास्तव में, Foo भी कार्यक्षम होने के लिए, 'prereq1', prereq2'Django में स्थापित किया जाना है। अब, requirements.txt या setup.py पर यह सुनिश्चित करने के लिए कि कोई Foo इंस्टॉल करने के लिए पुस्तकालय स्थापित है, लेकिन मैं यह नहीं समझ सकता कि अगर Django में स्वयं स्थापित करने का कोई तरीका है तो मैं यह नहीं समझ सकता।

इस का कारण किसी को फू का उपयोग करना चाहता है, तो, मैं जैसे निर्देश शामिल नहीं करना चाहती है:

में अपने INSTALLED_APPSfoo जोड़ने, लेकिन यह भी scary_looking_library_name और thing_you_dont_understand जोड़ें।

तो क्या किसी भी तरह से INSTALLED_APPS में किसी ऐप के लिए यह संभव है कि उस सूची में आगे के ऐप्स की आवश्यकता हो या इंजेक्ट करें?

उत्तर

14

मैं डैनियल रोसेमन के system checks framework के बारे में इन चेक के लिए इष्टतम स्थान होने के बारे में उत्तर देता हूं। प्रणाली जांच फ्रेमवर्क Django 1.7 पेश किया गया था।

हालांकि, मान लें कि आपके पास दस्तावेज है, आप Django REST Framework did in their installation instructions जैसी इन पूर्व-आवश्यकताएं भी दस्तावेज कर सकते हैं।

तब आप अपने कोड (django-mptt एक उदाहरण के रूप में इस्तेमाल) में नीचे की तरह कुछ कर सकते हैं:

try: 
    from mptt.fields import TreeForeignKey 
    from mptt.models import MPTTModel 
except ImportError: 
    raise ImportError(
     'You are using the `foo` app which requires the `django-mptt` module.' 
     'Be sure to add `mptt` to your INSTALLED_APPS for `foo` to work properly.' 
) 

इस विधि मैं कई अनुप्रयोगों में इस्तेमाल देखा है। दस्तावेज पढ़ने का काम डेवलपर पर निहित है।

शायद यह एक अवांछित/अनावश्यक राय है, लेकिन INSTALLED_APPS में निर्भरताओं का इंजेक्शन कुछ भी नहीं है जो मुझे लगता है कि आपको अपने आवेदन के साथ संभालना चाहिए।

मैं आम तौर पर Zen of Python जब डिजाइनिंग अनुप्रयोगों पालन करने की कोशिश: "। स्पष्ट अंतर्निहित से बेहतर है"

    • डेवलपर मैन्युअल INSTALLED_APPS
  1. में निर्भरता दर्ज करें "कार्यान्वयन कठिन है समझाने के लिए है, यह एक बुरा विचार है।"
    • INSTALLED_APPS में निर्भरता इंजेक्षन के लिए एक रास्ता पता लगाने की कोशिश की व्याख्या करना मुश्किल है। तीसरे पक्ष के निर्भरता जटिल कर रहे हैं, डेवलपर तय करने दें।
  2. " सरल जटिल से बेहतर है। "
    • यह निर्भरता दस्तावेज़ और उन्हें INSTALLED_APPS में जोड़ने के लिए डेवलपर की आवश्यकता के लिए आसान है।
  3. "वहाँ one-- और अच्छा होगा यदि केवल एक --obvious तरह से यह करने के लिए होना चाहिए।"
    • आम बात डेवलपर के लिए तीसरे पक्ष के एप्लिकेशन जोड़ने के लिए है INSTALLED_APPS - यही कारण है कि आप जो चाहते हैं (इंजेक्शन) करने का कोई स्पष्ट तरीका नहीं है।

एक डेवलपर एक एप्लिकेशन को सक्रिय करना चाहता है, वे करेंगे। जैसा कि आपने अपने उदाहरण में इतनी स्पष्ट रूप से कहा है, scary_looking_library_name और thing_you_dont_understand समझने के लिए डेवलपर की ज़िम्मेदारी है। डेवलपर के लिए इसे स्थापित करने का चयन करना एक अनावश्यक सुरक्षा जोखिम लगा रहा है। डेवलपर को अपने एप्लिकेशन का उपयोग करने और इसकी निर्भरताओं को आरंभ करने दें।

+0

मैं एक साफ समाधान की उम्मीद कर रहा था, लेकिन मुझे लगता है कि आप सही हैं। यह देखते हुए कि केवल एक डेवलपर केवल इस सामग्री में से कोई भी कर रहा है, ऐसा कोई कारण नहीं है कि वे कुछ बुनियादी पूर्व-आवश्यकताएं संभाल सकें। –

6

मुझे लगता है कि system check framework इसके लिए एक अच्छी जगह होगी। आप एक चेक लिख सकते हैं जो सेटिंग्स में उन ऐप्स की उपस्थिति को सत्यापित करता है और यदि वे वहां नहीं हैं तो एक त्रुटि उठाती है।

2

मैं निर्भरता जांच करना पसंद करता हूं, हालांकि मुझे लगता है कि आप नीचे दिए गए कोड को अपने वांछित ऐप्स को django साइट में इंजेक्ट करने की मांग करते हैं।

आपको इसे निष्पादित करने के लिए कहीं और रखना होगा, और निर्भरता लोड होने पर पुनः निष्पादित न करने की जांच करें। यदि आप इसका उपयोग करते हैं, तो 'someapp' in settings.INSTALLED_APPS सही तरीके से काम नहीं करेगा। शायद आपको इसे बदलने की जरूरत है।

from django.apps import apps 
installed_apps = [app.__name__ for app in apps.get_apps()] 
new_installed_app = installed_app + ['your desired app1', 'your desired app2', ...] 
apps.set_installed_apps(new_installed_apps) 
+0

'apps.set_installed_apps()' Django के परीक्षण सूट द्वारा उपयोग की जाने वाली एक निजी विधि है, और इसे सावधानी के साथ उपयोग किया जाना चाहिए। यह Django की पिछली संगतता नीति द्वारा कवर नहीं है, और मामूली संस्करण उन्नयन में भी बदलाव के अधीन है। – knbk

+0

@knbk, मुझे पता है। और मैंने उल्लेख किया कि निर्भरता जांच को प्राथमिकता दी जाती है। लेकिन किसी ने पिछड़े संगतता के लिए नहीं पूछा। अजगर में भी कुछ भी निजी नहीं है! – wtayyeb

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

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