2014-11-04 8 views
5

तो, यह एक डोज़ी था। मैं एक कामकाज में डाल रहा हूं, लेकिन वहां एक बेहतर समाधान होने पर इसे बाहर निकालना। और, इसे समझने से पहले कई घंटे बिताए, मैं इसे गॉचा के रूप में भी बाहर रख रहा हूं।django 1.7 gotcha - django.setup() आकस्मिक रिकर्सन कॉल

असल में, मैं सोच रहा था कि django.setup() को रिकर्सिव कॉल से बचने के लिए चालाक तरीके हैं या नहीं।

मेरे पास 3 या 4 बैच स्क्रिप्ट हैं जिन्हें मैं स्टैंडअलोन मोड या सेलेरी में चला सकता हूं। (मैं पूरी तरह आश्वस्त नहीं हूँ

from pssecurity.batch.build_profiles import \ 
    ProfileManager as MgrCls_profiles, \ 
    getOptParser as getOptParser_profiles 

Django 1.6 में इस व्यवस्था ठीक काम किया: उनमें से एक

रास्ता अजवाइन उन्हें (tasks.py में से एक में) को देखने के लिए फ़ाइलों को हो जाता है build_profiles.py कहा जाता है संभावित रूप से स्टैंड-अलोन प्रक्रियाओं को लॉन्च करने का सबसे अच्छा तरीका है लेकिन यह एक और कहानी है)।

जब मैंने कमांड लाइन से build_profiles.py चलाने की कोशिश की, तो उसने AppRegistryNotReady त्रुटि दी।

कोई बात नहीं, मैंने सोचा, चलो build_profiles.py के शीर्ष पर निम्नलिखित जोड़ने के लिए, के रूप में https://docs.djangoproject.com/en/dev/ref/applications/#applications-troubleshooting प्रति

import django 
django.setup() 

और फिर कुछ भी नहीं Django के साथ अब और काम कर रहा था करते हैं। यूनिट परीक्षण नहीं चलेंगे, manager.py रनरवर लटका होगा। स्टैंड स्टैंड अकेले बैच में बदलाव कैसे मेरे सिस्टम को रोक सकता है?

कि django.setup बाहर कर देता है() अजवाइन जो अपने कार्यों को लोड करता है पता चलता है, और उन में से एक का अपना django.setup() कर समाप्त होता है अगर ...

+0

अपना समाधान पोस्ट करने के लिए धन्यवाद। हालांकि, एसओ पर संपादकीय प्रथाएं ऐसी हैं कि प्रश्नों में केवल प्रश्न और समाधान होना चाहिए औपचारिक रूप से उत्तर के रूप में पोस्ट किया जाना चाहिए। कृपया अपना कामकाज औपचारिक उत्तर के रूप में पोस्ट करें और इसे अपने प्रश्न से हटा दें। – Louis

+0

शायद यह मदद करता है: http://stackoverflow.com/a/32095654/633961 – guettli

उत्तर

2

@ jl-peyret द्वारा उदाहरण पर थोड़ा सा निर्माण करने के लिए, मैंने मॉडल के उपयोग को लपेटने के बिना फ़ाइल के शीर्ष में अपवाद ट्रिगर करने के लिए निम्न स्निपेट का उपयोग किया है और पता है कि मॉडल में से कौन सा उपयोग किया जाएगा पहला:

from django.core.exceptions import AppRegistryNotReady 
try: 
    from django.apps import apps 
    apps.check_apps_ready() 
except AppRegistryNotReady: 
    import django 
    django.setup() 
1

मेरे वैकल्पिक हल AppRegistryNotReady त्रुटि को पकड़ने के लिए था और फोन django.setup() केवल यदि आवश्यक:

try: 
    self.loadrdb(rdbname) 
except AppRegistryNotReady: 
    django.setup() 
    self.loadrdb(rdbname) 

इस नीचे भी काम किया, लेकिन मुझे लगता है कि ट्राई/कैच क्लीनर

if __name__ == "__main__": 
    import django 
    django.setup() 

है काश वे Django के साथ idempotent बनाया है, .setup() यह समझने के लिए पर्याप्त स्मार्ट है कि यह पहले से ही चलाया गया था और बिना किसी काम किए चुपचाप लौट आया।

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