2009-02-09 16 views
6

में मैं खूंखार "बिना क्रिया के अपवाद" Flup द्वारा उठाए का सामना करना पड़ रहा है। दुखद हिस्सा यह वेबसर्वर (lighttpd + flup) स्तर पर उठाया गया है, न कि आवेदन स्तर (Django) पर। इसलिए समस्या के बारे में कोई 500 ईमेल उठाया नहीं गया है।बिना क्रिया के अपवाद Flup

हमारी पूरी टीम ने संदिग्ध आयात के कारण त्रुटियों को बढ़ाने की संभावनाओं को खत्म करने के लिए किसी भी अस्पष्ट आयात और उस तरह के किसी भी प्रकार के कोडबेस को साफ करने के लिए कड़ी मेहनत की। और हमने कोड में कई चीजें साफ कर दीं। अभी भी एक ही अपवाद।

खुलकर मैं वास्तव में Flup की त्रुटि से निपटने से निराश हूँ होने के लिए। यह आपको कुछ नहीं बताता है। सबसे बुरी बात यह है कि यह उपयोगकर्ताओं को समान "अनचाहे अपवाद" दिखाती है। मैं इसे कैसे पास करूं?

मैं lighttpd लॉग की जाँच की। मैं देखता हूं कि "इंटरफ़ेस त्रुटि/कनेक्शन पहले ही बंद है।" यह तब होता है जब मेरा आवेदक एफसीजीआई मोड में चल रहा है। तो समस्या यह है कि फ्लूप वास्तव में मेरे कोड (एप्लिकेशन) से कैसे निपट रहा है। मैं इसे कैसे पास करूं?

मैं flup के लिए विकल्प के लिए जाँच की है, लेकिन स्पष्ट रूप से Django flup पर निर्भर करता है (जो एक और प्रतिबंध नहीं है, और मुझे हैरान) (संदर्भ: django_src/Django/कोर/सर्वर/fastcgi.py लाइन: 100/131)

मैं इस परिदृश्य को कम से कम कैसे डिबग करूं और समस्या हल कर सकता हूं? कृपया मेरी मदद करें। आवेदन 3 दिनों के लिए नीचे दिया गया है।

उत्तर

3

मैं lighttpd या flup का उपयोग नहीं करते, तो यह रूप में ज्यादा के रूप में यह संकेत है एक जवाब नहीं है।

मैं एक लॉगफ़ाइल को कम से कम लेखन अपने अनुप्रयोग फ़ाइल में PDB को चलाने के लिए कोशिश कर रहा द्वारा शुरू कर दूं, या इससे पहले कि आप flup सर्वर .run() विधि कहते हैं। इस तरह आप समस्या को फास्टसी या फ्लॉप में होने की पहचान कर सकते हैं। Mod_wsgi विकी में Python Interactive Debugger नामक अनुभाग देखें। यह आपको lighttpd और flup के साथ एक ही चीज़ को करने के तरीके पर विचार दे सकता है।

तो फिर, अगर समस्या flup आप pdb में अपवाद को पकड़ने जाएगा और वहाँ से डिबग कर सकते हैं।

यदि समस्या lighttpd है तो आपको शायद अपनी कॉन्फ़िगरेशन फ़ाइल में किसी प्रकार की समस्या हो सकती है, या शायद lighttpd के निर्माण के तरीके में कोई समस्या हो सकती है। हो सकता है कि lighttp और इसके fastcgi मॉड्यूल के बीच एक सिस्टम लाइब्रेरी मेल नहीं है?

अपने ऐप को nginx + fastcgi के अंतर्गत चलाने का प्रयास करें और देखें कि यह काम करता है या कम से कम आपको बेहतर त्रुटि संदेश देता है।

बीटीडब्ल्यू, फ्लिप hates FCGI and doesn't even use flup anymore के लेखक ... मैं nginx या apache + mod_wsgi पर स्विच करने की अनुशंसा करता हूं।

+0

धन्यवाद वान। मैं इसे पूरी तरह से प्राप्त करता हूं और वर्तमान में मुझे wsgi internals में रुचि है और nginx के बारे में पढ़ना है। परंतु। जो वास्तव में Flup का काम है - क्या flup पर Django डिपेंडेंस ?? के बारे में अपनी टिप्पणी –

+0

nginx साथ Django को चलाने के लिए (। मैं अपने सवाल में fastcgi.py उल्लेख किया है कृपया इसे पर एक नजर है) आप FastCGI को WSGI को पाटने की जरूरत है। – zgoda

+0

वान और Zgoda, आप मेरे सवाल का वर्णन से समझ सकते हैं जैसा कि मैंने Flup साथ बहुत नाखुश हूं (और यह त्रुटि/अपवाद हैंडलिंग और कैसे यह आपकी साइट उपयोगकर्ताओं को दिखाता है)। क्या फ्लुप का उपयोग करने का कोई विकल्प है? (और django के fastcgi.py फ़्लूप निर्भरता के बारे में क्या?) यह है कि मेरा प्रश्न बिल्कुल क्या है! –

9

यह Django से अनुरोध प्रसंस्करण शुरू करने से पहले त्रुटि को इंगित करता है, जैसे सेटिंग्स मॉड्यूल के भीतर वाक्यविन्यास त्रुटि। ऐसी समस्या को डीबग करने का सबसे तेज़ तरीका फास्टसीजीआई डीबग चालू करना है। इस लाइन 128 django/core/servers/fastcgi.py में है:

wsgi_opts['debug'] = False # Turn off flup tracebacks 

तो इस तरह संशोधित Django के साथ एप्लिकेशन को चलाने के लिए, आप पूरी अपनी महिमा में Flup ट्रैस बैक देखेंगे।

6

मैंने कुछ ऐसा ही मारा - हमें एनजीआईएनएक्स के पीछे डीजेगो मिला है, और हम Django को 500 को संभालने की अनुमति देते हैं - यह 99.9% समय काम करता है, लेकिन जब हम उन्नयन कर रहे होते हैं, तो कभी-कभी इन "अनचाहे अपवाद" के माध्यम से पर्ची होती है।

Django त्रुटियों को संभालने के लिए फ्लूप के हुक ओवरराइड नहीं करता है, इसलिए हमें खुद को ऐसा करने की आवश्यकता होगी, और Django इन त्रुटियों को संभालने दें।

पहले डीजेंगो के माध्यम से त्रुटियों के लिए flup.server.BaseFCGIServer.error ओवरराइड करें। फिर हम उन त्रुटियों को देखने के लिए हमारे संशोधित BaseFCGIServer का उपयोग करने के लिए Django को बताएंगे।

चूंकि पाइथन अद्भुत है, इसलिए हम धोखा देंगे और पूरी चीज को एक ही स्थान पर बंद कर देंगे, django.core.servers.fastcgi.py। यहां हम जाते हैं:

# django.core.servers.fastcgi.py 

def runfastcgi(argset=[], **kwargs): 
    # ... 

    # Paste his hack right after the `module` try/catch. 

    # Override BaseFCGIServer.error to use Django error handling. 
    # http://trac.saddi.com/flup/browser/flup/server/fcgi_base.py#L1210 
    def patch_error(self, req): 
     import sys 
     from django.conf import settings 
     from django.core import urlresolvers 
     from django.core.handlers.wsgi import WSGIRequest 

     urlconf = settings.ROOT_URLCONF 
     urlresolvers.set_urlconf(urlconf) 
     resolver = urlresolvers.RegexURLResolver(r'^/', urlconf) 

     # No access to 'environ' so rebuild WSGIRequest. 
     # http://trac.saddi.com/flup/browser/flup/server/fcgi_base.py#L1077 
     environ = req.params 
     environ.update(self.environ) 
     environ['wsgi.version'] = (1,0) 
     environ['wsgi.input'] = req.stdin 
     self._sanitizeEnv(environ)   
     wsgireq = WSGIRequest(environ) 

     # http://code.djangoproject.com/browser/django/trunk/django/core/handlers/base.py#L177  
     response = self.application.handle_uncaught_exception(wsgireq, resolver, sys.exc_info()) 

     # TODO: NGINX figures this out, but other servers might not. 
     # http://trac.saddi.com/flup/browser/flup/server/fcgi_base.py#L1104 
     req.stdout.write('Status: 500\r\n') 
     req.stdout.write('Content-Type: text/html\r\n\r\n' + response.content)  

    WSGIServer.error = patch_error 

अब आप फ्लैप स्तर त्रुटियों के लिए भी Django स्टैक निशान का आनंद ले सकते हैं!

+0

एक अद्भुत जवाब है। धन्यवाद जेबॉक्स। –

+0

मैं इस उत्तर को +++ करना चाहता हूं! अब मैं केवल 'अनचाहे अपवाद' की बजाय मुझे आवश्यक सारी जानकारी देखता हूं। – Octopus

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