2012-12-11 20 views
5

मिडलवेयर के साथ पहले, मैं शुरुआत और प्रत्येक HTTP अनुरोध के अंत में कोड निष्पादित कर सकते हैं।भागो कोड किसी भी Django प्रबंधन कमांड

सेलेरी कार्यों के साथ मैं task_prerun और task_postrun सिग्नल का उपयोग करके इसे पूरा कर सकता हूं।

क्या Django प्रबंधन आदेशों के बारे में? क्या यह कोड होना संभव है जो प्रत्येक django प्रबंधन कमांड की शुरुआत (और संभवतः अंत) पर चलता है? इस तरह के कोड को यह भी पता होना चाहिए कि कौन सा django प्रबंधन कमांड चल रहा है (या चल रहा है)। signal on application startup के बारे में एक टिकट है जो मैं चाहता हूं कि वह कर सकता है या नहीं, लेकिन यह वैसे भी तैयार नहीं है।

उत्तर

2

आप सही तरीके से राज्य के रूप में वहाँ जहाँ आप कोड है कि हर स्टार्टअप पर निष्पादित किया जाता है डाल सकते हैं Django में कोई विशेष जगह है ...

कुछ स्थानों है कि आप इस उद्देश्य के लिए 'दुरुपयोग', जैसे करने के लिए सक्षम हो सकता है कर रहे हैं । urls.py में या models.py में कोड स्टार्टअप पर चलाया जाना चाहिए ... (जैसे। व्यवस्थापक urls.py में अपनी admin.autodiscover() के लिए इस परिस्थिति का उपयोग करता है)।

वहाँ जानने के लिए कि कोड एक प्रबंधन आदेश के निष्पादन के कारण चलाया जा रहा है भी कुछ संभावनाएं हैं; यदि आप कोई प्रबंधन आदेश रखते हैं तो आप sys.argv के माध्यम से कमांड लाइन तर्कों को स्पष्ट रूप से जांच सकते हैं। एक और संभावना सर्वर/प्रबंधन कमांड के माध्यम से ऐप चलाने के लिए अलग-अलग सेटिंग्स निर्दिष्ट करना होगा ....

+0

झूठी सकारात्मक कॉल को रोकने के लिए की आवश्यकता होगी यह था मेरी सोचा, भी। एक अन्य से कम पूरी तरह से साफ दृष्टिकोण, MonkeyPatch django.core.management.base.py होगा विशेष रूप से 'BaseCommand.execute()', और इसके चारों ओर एक आवरण डाल दिया। –

+0

ठीक है अगर आपको बंदर-पैचिंग सुनिश्चित करना पसंद है ... आप पहले स्थान पर क्या हासिल करना चाहते हैं? –

+0

ठीक है, एक बात के लिए, मैं चाहता हूं कि जब मैं वाह खेल रहा हूं तो मैं अपने बंदर को दुर्घटनाग्रस्त होना बंद कर दूंगा। :-) –

0

यदि प्रबंधन कमांड के पहले/बाद में आपको जोड़ने के लिए कोड को django मॉडल/सेटिंग्स तक पहुंच की आवश्यकता नहीं है तो आप कर सकते हैं बस manage.py स्क्रिप्ट अपडेट करें।

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings") 

from django.core.management import execute_from_command_line 
from startup import pre_management_command, post_management_command 

pre_management_command(sys.argv[1], sys.argv[2:]) 
execute_from_command_line(sys.argv) 
post_management_command(sys.argv[1], sys.argv[2:]) 

मैं नहीं 100% यकीन है, लेकिन मुझे लगता है post_management_command मॉडल django के लिए उपयोग किया जाएगा।

यह सिर्फ बुनियादी उदाहरण, हकीकत में यू सुनिश्चित करना है कि sys.argv कम से कम दो प्रविष्टियां हैं और दूसरी प्रविष्टि - साथ शुरू नहीं करता है उस तरह

./manage.py 
./manage.py -h 
./manage.py --help 
संबंधित मुद्दे