Django: "परियोजनाओं" बनाम "क्षुधा"


202

मेरे पास एक काफी जटिल "उत्पाद" है जो मैं Django का उपयोग करके बनाने के लिए तैयार हो रहा हूं। मैं इस संदर्भ में "प्रोजेक्ट" और "एप्लिकेशन" का उपयोग करने से बचने जा रहा हूं, क्योंकि मैं Django में उनके विशिष्ट अर्थ पर स्पष्ट नहीं हूं।

प्रोजेक्ट में कई ऐप हो सकते हैं। ऐप्स को कई प्रोजेक्ट्स के बीच साझा किया जा सकता है। ठीक।

मैं ब्लॉग या फ़ोरम को पुन: स्थापित नहीं कर रहा हूँ - मैं अपने उत्पाद के किसी भी हिस्से को किसी भी संदर्भ में पुन: प्रयोज्य नहीं देखता हूँ। सहज रूप से, मैं इसे एक "एप्लिकेशन" कहूंगा। क्या मैं तब अपना सारा काम एक "ऐप" फ़ोल्डर में कर सकता हूं?

यदि ऐसा है ... Django के project.appनाम स्थान के संदर्भ में , मेरा झुकाव उपयोग करने के लिए है myproduct.myproduct, लेकिन निश्चित रूप से इसकी अनुमति नहीं है (लेकिन मैं जो आवेदन कर रहा हूं वह मेरी परियोजना है, और मेरी परियोजना एक आवेदन है!)। इसलिए मुझे विश्वास है कि शायद मैं "महत्वपूर्ण" मॉडल के अनुसार एक ऐप बनाकर Django से संपर्क करने वाला हूं, लेकिन मुझे नहीं पता कि इसे ऐप में अलग करने के लिए मेरे स्कीमा में सीमाएं कहां खींचनी हैं - मेरे पास बहुत कुछ है अपेक्षाकृत जटिल संबंधों वाले मॉडल।

मुझे उम्मीद है कि इस के लिए एक आम समाधान है ...


1
डॉक्स यहां "एप्लिकेशन" और "प्रोजेक्ट" के बीच के अंतर को स्पष्ट करते हैं: डॉक्स
guettli

जवाबों:


56

आपको क्या उपयोग करना बंद करना है myproduct.myproduct? मोटे तौर पर ऐसा करने के लिए आपको क्या हासिल करना होगा:

django-admin.py startproject myproduct
cd myproduct
mkdir myproduct
touch myproduct/__init__.py
touch myproduct/models.py
touch myproduct/views.py

और इसी तरह। क्या यह मदद करेगा अगर मैंने कहा कि views.pyबुलाया नहीं जाना चाहिए views.py? बशर्ते आप नाम दे सकते हैं, अजगर पथ पर, एक फ़ंक्शन (आमतौर पर पैकेज। package.views.function_name) यह संभाला जाएगा। इतना ही आसान। यह सब "प्रोजेक्ट" / "ऐप" सामान सिर्फ अजगर पैकेज है।

अब, आप इसे कैसे करना चाहिए? या बल्कि, मैं इसे कैसे कर सकता हूं? ठीक है, यदि आप पुन: प्रयोज्य कार्यक्षमता का एक महत्वपूर्ण टुकड़ा बनाते हैं, जैसे मार्कअप संपादक कहते हैं, कि जब आप एक "शीर्ष स्तर का ऐप" बनाते हैं widgets.py, जिसमें शामिल हो सकता है fields.py, context_processors.pyआदि - सभी चीजें जिन्हें आप आयात करना चाहते हैं।

इसी तरह, यदि आप एक ब्लॉग की तरह एक प्रारूप बना सकते हैं, जो इंस्टॉल में काफी सामान्य है, तो आप इसे अपने ही टेम्प्लेट, स्टैटिक कंटेंट फोल्डर आदि के साथ ऐप में रैप कर सकते हैं और इसका उपयोग करने के लिए एक django प्रोजेक्ट का एक उदाहरण कॉन्फ़िगर कर सकते हैं। एप्लिकेशन की सामग्री।

कोई कठिन और तेज़ नियम नहीं हैं जो कह रहे हैं कि आपको ऐसा करना चाहिए, लेकिन यह रूपरेखा के लक्ष्यों में से एक है। तथ्य यह है कि सब कुछ, शामिल टेम्पलेट्स, आपको कुछ सामान्य आधार से शामिल करने की अनुमति देता है इसका मतलब है कि आपके ब्लॉग को किसी अन्य सेटअप में आसानी से फिट होना चाहिए, बस अपने हिस्से की देखभाल करके।

हालाँकि, आपकी वास्तविक चिंता का समाधान करने के लिए, हाँ, कुछ भी नहीं कहता है कि आप शीर्ष स्तर के प्रोजेक्ट फ़ोल्डर के साथ काम नहीं कर सकते। यह वही है जो आप करते हैं और यदि आप वास्तव में चाहते हैं तो आप इसे कर सकते हैं। हालाँकि, मैं कई कारणों से नहीं:

  • Django का डिफ़ॉल्ट सेटअप ऐसा नहीं करता है।
  • अक्सर, मैं एक मुख्य ऐप बनाना चाहता हूं, इसलिए मैं एक बनाता हूं, जिसे आमतौर पर कहा जाता है website। हालाँकि, बाद की तारीख में मैं इस साइट के लिए मूल कार्यक्षमता विकसित करना चाहता हूँ। इसे हटाने योग्य बनाने के लिए (चाहे या कभी नहीं) मैं एक अलग निर्देशिका बनाने की प्रवृत्ति रखता हूं। इसका मतलब यह भी है कि मैं उस पैकेज को विन्यास से हटाकर और फ़ोल्डर को हटाकर कार्यक्षमता को छोड़ सकता हूं, बजाय एक जटिल के कि वैश्विक urls.py फ़ोल्डर से सही यूआरएल हटा दें।
  • बहुत बार, यहां तक ​​कि जब मैं कुछ स्वतंत्र करना चाहता हूं, तो इसे कहीं और जीने की आवश्यकता होती है, जबकि मैं इसे देखता हूं / इसे स्वतंत्र बनाता हूं। मूल रूप से उपरोक्त मामला है, लेकिन सामान के लिए मैं सामान्य बनाने का इरादा रखता हूं।
  • मेरे शीर्ष स्तर के फ़ोल्डर में अक्सर कुछ अन्य चीजें शामिल होती हैं, जिनमें wsgi स्क्रिप्ट, sql स्क्रिप्ट आदि तक सीमित नहीं होती हैं।
  • django के प्रबंधन एक्सटेंशन उपनिर्देशिकाओं पर निर्भर करते हैं। तो यह उचित रूप से संकुल नाम के लिए समझ में आता है।

संक्षेप में, एक सम्मेलन का कारण किसी भी अन्य सम्मेलन के समान है - यह तब मदद करता है जब यह आपकी परियोजना के साथ काम करने वाले अन्य लोगों के लिए आता है। अगर मुझे लगता है कि fields.pyमैं तुरंत django के क्षेत्र को उप-वर्ग करने के लिए इसमें कोड की अपेक्षा करता हूं, जबकि अगर मैं देखता inputtypes.pyहूं तो मैं इसे देखने के बिना इसका क्या मतलब है, इस पर इतना स्पष्ट नहीं हो सकता।


24
+1 ... "myproduct.myproduct का उपयोग करके आपको क्या रोकना है?" - Django का "स्टार्टअप" कमांड वास्तव में आपको रोकता है, मैं मानता हूं, एक सम्मेलन के रूप में। मैं सम्मेलनों को पसंद करता हूं, विशेष रूप से टीम प्रयास के संदर्भ में, लेकिन मैं उनके पीछे के तर्क को समझना पसंद करता हूं :)
डॉल्फ

@ डॉल्फ आह, करता है? मैंने इसका उपयोग पहली बार नहीं किया है क्योंकि मैंने इसका उपयोग किया है क्योंकि मेरे पास एक प्रोजेक्ट बनाने के लिए अपनी खुद की कमान है जो पहले मॉडल बनाता है फिर इन मॉडलों के लिए सीआरयूडी सामान ऑटो उत्पन्न करता है। फिर भी, हाँ सम्मेलन अच्छे हैं। मैं django सम्मेलनों का पालन करता हूं यदि केवल इसलिए कि बड़े पैमाने पर बोलने से उन्हें समझ में आता है।

1
मैं जोड़ूंगा कि किसी प्रोजेक्ट के लिए एक ही नाम और इसके भीतर एक ऐप का उपयोग करने से भी समस्याएं आती हैं manage.py, जिससे यह आपकी प्रोजेक्ट सेटिंग्स को सही तरीके से आयात करने में असमर्थ होता है। यह मेरे साथ हुआ, और मैंने इसे एप को प्रभाव में लाकर हल कर दिया myproduct_app
BHSPitMonkey

89

एक बार जब आप उपयोग करने से स्नातक हो जाते हैं startprojectऔर startapp, आपको एक ही प्रोजेक्ट के "प्रोजेक्ट" और "ऐप" को एक ही पायथन पैकेज में संयोजित करने से रोकना नहीं है। एक परियोजना वास्तव में एक settingsमॉड्यूल से ज्यादा कुछ नहीं है , और एक ऐप वास्तव में एक modelsमॉड्यूल से ज्यादा कुछ नहीं है - बाकी सब वैकल्पिक है।

छोटी साइटों के लिए, कुछ ऐसा होना पूरी तरह से उचित है:

site/
    models.py
    settings.py
    tests.py
    urls.py
    views.py

18
+1 सारांश: प्रोजेक्ट में सेटिंग्स हैं, ऐप में मॉडल एएमडी है। वे समान स्तर की संरचना हैं। मुझे लगता था कि परियोजना ऐप की तुलना में एक स्तर अधिक है, मुझे लगता है कि मैं गलत था
फिलिप 007

2
@claymation, 'python manage.py makemigrations' या 'python manage.py प्रवास' की अनुमति देने के लिए सेटिंग्स में (ऐप के रूप में) क्या शामिल होना चाहिए, ताकि मेरे 'उत्पाद' निर्देशिका में 'model.py' फ़ाइल देखें?
mlwn

1
@mlwn मुझे एहसास है कि मैं इसका उत्तर देने में सुपर लेट हूं लेकिन मैं खुद भी ऐसी ही स्थिति में हूं और मैं बहुत सारे उत्तर देख रहा हूं। आपके प्रश्न का उत्तर देने के लिए, आपको अपनी परियोजना को INSTALLED_APPSसूची में शामिल करना होगा । यहाँ एक उदाहरण है: stackoverflow.com/a/59739912/399435
कार्तिक रघुपति

@KarthicRaghupathi, धन्यवाद .. :) चार साल बाद उत्तर दिए जा रहे टिप्पणियों को देखकर अच्छा लगा .. चीयर्स
15

69

प्रश्न का उत्तर देने का प्रयास करें: "मेरा आवेदन क्या करता है?"। यदि आप एक वाक्य में जवाब नहीं दे सकते हैं, तो शायद आप इसे क्लीनर तर्क के साथ कई ऐप में विभाजित कर सकते हैं।

मैंने इस विचार को कहीं जल्द ही पढ़ा जब मैंने django के साथ काम करना शुरू किया और मुझे पता चला कि मैं खुद से यह सवाल अक्सर पूछता हूं और यह मेरी मदद करता है।

आपके ऐप्स को पुन: उपयोग करने की आवश्यकता नहीं है, वे एक-दूसरे पर निर्भर हो सकते हैं, लेकिन उन्हें एक काम करना चाहिए।


8
मैं अभी भी थोड़ा संघर्ष कर रहा हूं जब यह अपना खुद का ऐप बिछाने की बात करता है। मुझे लगता है कि मेरा मुख्य आवेदन थोड़ा भारी है, लेकिन एक ही समय में, मैं कुछ शिथिल युग्मित के समान किसी भी चीज़ में इसे रिफ्लेक्टर नहीं कर पाऊंगा। मुझे लगता है कि यह वास्तव में मेरी मुख्य प्रमुख संस्थाओं को अलग करने के लिए एक सुधार नहीं होगा, अगर वे अभी भी एक-दूसरे पर बहुत अधिक निर्भर करते हैं, और क्षितिज पर पुन: उपयोग या सामान्यीकरण करने की कोई आवश्यकता नहीं है, तो मैं इस ओर झुकाव कर रहा हूं। मैं "समय से पहले अनुकूलन नहीं करता हूं" की व्याख्या के रूप में "समय से पहले
रिफ्लेक्टर

15

मैंने निम्नलिखित ब्लॉग पोस्टों को django अनुप्रयोगों और परियोजनाओं के बारे में बहुत उपयोगी पाया है:

सिद्धांत रूप में, आपको अपने उत्पाद के स्रोत कोड को व्यवस्थित करने के लिए django के साथ बहुत अधिक स्वतंत्रता है।


8

यदि ऐसा है ... Django के project.app नाम स्थान के संदर्भ में, मेरा झुकाव usemyproduct.myproduct में है, लेकिन निश्चित रूप से इसकी अनुमति नहीं है

ऐसा कुछ नहीं है जिसकी अनुमति नहीं है। आपकी परियोजना, कोई भी आपको प्रतिबंधित नहीं कर रहा है। उचित नाम रखना उचित है।

मैं अपने उत्पाद के किसी भी हिस्से को किसी भी संदर्भ में पुन: प्रयोज्य नहीं देखता हूं। सहज रूप से, मैं इसे एक "एप्लिकेशन" कहूंगा। क्या मैं तब अपना सारा काम एक "ऐप" फ़ोल्डर में कर सकता हूं?

एक सामान्य django परियोजना में कई एप्लिकेशन (कंट्रीब ऐप) हैं जो वास्तव में हर परियोजना में उपयोग किए जाते हैं।

हम कहते हैं कि आपकी परियोजना केवल एक ही कार्य करती है और इसका केवल एक ही ऐप है (मैं इसे नाम देता हूं mainक्योंकि यह परियोजना इसके चारों ओर घूमती है और शायद ही प्लग करने योग्य है)। यह परियोजना अभी भी आम तौर पर कुछ अन्य ऐप का उपयोग करती है।

अब यदि आप कहते हैं कि आपकी परियोजना केवल एक ऐप का उपयोग कर रही है ( INSTALLED_APPS='myproduct') तो projectपरियोजना को परिभाषित करने का क्या उपयोग है project.app, मुझे लगता है कि आपको कुछ बिंदुओं पर विचार करना चाहिए:

  • कई अन्य चीजें हैं जो एक प्रोजेक्ट हैंडल (आधार स्टैटिक फाइल, बेस टेम्प्लेट, सेटिंग्स .... यानी आधार प्रदान करता है) में ऐप के अलावा अन्य कोड हैं।
  • सामान्य project.app दृष्टिकोण में django स्वचालित रूप से मॉडल से sql स्कीमा को परिभाषित करता है।
  • आपका प्रोजेक्ट पारंपरिक दृष्टिकोण के साथ बनाया जाना बहुत आसान होगा।
  • आप अपनी इच्छानुसार यूआरएल, विचार और अन्य फ़ाइलों के लिए कुछ अलग नामों को परिभाषित कर सकते हैं, लेकिन मुझे इसकी आवश्यकता नहीं है।
  • आपको भविष्य में कुछ अनुप्रयोगों को जोड़ने की आवश्यकता हो सकती है जो पारंपरिक django परियोजनाओं के साथ वास्तविक रूप से आसान होंगे जो अन्यथा समान या अधिक कठिन और थकाऊ हो सकते हैं।

जहां तक ​​ऐप में किए जा रहे ज्यादातर काम का सवाल है, मुझे लगता है कि ज्यादातर django प्रोजेक्ट्स का यही हाल है।


1
+1, इस mainसम्मेलन के लिए जासूसी - जो इस तरह से एक मूल परियोजना के लिए मेरे लिए बहुत मायने रखता है। मैं बाद में "पुन: प्रयोज्य" ऐप जोड़ने की योजना बना रहा हूं, लेकिन अभी मेरे ध्यान के बाहर है।
डॉल्फ

2

यहाँ Django के रचनाकार खुद उस अंतर को बताते हैं । मुझे लगता है कि अन्य प्रोजेक्ट्स में पुन: प्रयोज्य होने के लिए ऐप्स के बारे में सोचना अच्छा है । Django में Apps के बारे में सोचने का एक अच्छा तरीका आधुनिक वेब एप्लिकेशन प्रदान करता है।

कल्पना कीजिए कि आप जावास्क्रिप्ट पर आधारित बड़े गतिशील वेब ऐप बना रहे हैं ।

आप तब django App में बना सकते हैं, जिसका नाम "FrontEnd" <- thins app में आप सामग्री प्रदर्शित करेंगे।

फिर आप कुछ बैकएंड ऐप बनाएं। उदाहरण के लिए "टिप्पणियां" नाम दिया गया है जो उपयोगकर्ता टिप्पणियों को संग्रहीत करेगा। और "टिप्पणियां" ऐप खुद कुछ भी प्रदर्शित नहीं करेगा। यह आपके गतिशील जेएस वेबसाइट के AJAX अनुरोधों के लिए सिर्फ एपीआई होगा ।

इस तरह आप हमेशा अपने "कमेंट्स" ऐप का फिर से उपयोग कर सकते हैं। आप इसे पूरी परियोजना के स्रोत को खोले बिना खुला स्रोत बना सकते हैं। और आप अपने प्रोजेक्ट का स्वच्छ तर्क रखते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.