2012-11-11 16 views
7

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

इस विशेष मामले में, मेरी समस्या यह है कि मुझे हर प्रतिक्रिया पर "वेरी: कुकी" मिल रहा है, जिनमें से कुछ मुझे भारी कैश करना चाहते हैं और जहां मुझे किसी भी कुकीज़ की आवश्यकता नहीं है। मुझे संदेह है, लेकिन यह साबित करने के बारे में नहीं पता कि कुछ मिडलवेयर या संदर्भ प्रोसेसर request.session तक पहुंच रहा है, भले ही यह परिणाम का उपयोग न करे - हालांकि यह request.user के माध्यम से अप्रत्यक्ष पहुंच हो सकता है। और निश्चित रूप से यह पूरी तरह से कुछ और हो सकता है।

पायथन में, आप एक बड़े कोडबेस में इसके कारण से एक प्रभाव से कैसे पता लगाएंगे ("वरी हेडर प्रतिक्रिया में जोड़ा गया था")?

+1

हैलो। मैं django से परिचित नहीं हूं, लेकिन अगर आपको यह पता लगाना है कि 'ए [' एक्स '] = वाई' और' ए 'एक बिल्टिन ऑब्जेक्ट नहीं है तो आप केवल ए .__ setitem__ को अपने आप से बदल सकते हैं जांचें, क्या "वेरी: कुकी" हेडर '__setitem__' निष्पादित करने के बाद दिखाई दिया है, और यदि ऐसा है, तो बस कॉल स्टैक प्रिंट करें जो आपको उस चीज़ के बारे में मार्गदर्शन करेगा जो इसके कारण हुआ है। एक अन्य संस्करण एक डीबगर लिखना है जो आपकी प्रोग्राम लाइन को लाइन द्वारा निष्पादित करेगा और प्रत्येक बार जांच करेगा, यदि आपको आवश्यक हेडर को विशेष ऑब्जेक्ट में जोड़ा गया है। –

+0

धन्यवाद, @alex_jordan, यह एक अच्छी शुरुआत है। आप प्रोग्राम स्टैक को प्रोग्राम स्टैक कैसे प्रिंट करते हैं? और इस मामले में मेरा मानना ​​है कि यदि ध्वज कहीं और सेट किया गया है तो हेडर जोड़ा जाएगा, इसलिए कॉल स्टैक मुझे बताएगा कि कौन सा झंडा इसे ट्रिगर करता है; लेकिन जब ध्वज सेट किया गया था तो क्या मैं फ़ील्ड असाइनमेंट का पता लगा सकता हूं? अंत में, प्रश्न में वस्तुओं को प्रति अनुरोध आवंटित किया जाता है। क्या मैं उन सभी वर्गों के लिए ऐसा करने के लिए कक्षा से बंदर-पैच कर सकता हूं? –

+0

जैमी, नीचे दिया गया समाधान केवल वही करता है और django त्रुटि रिपोर्टिंग का उपयोग करता है ताकि आपको खुद को स्टैक ट्रेस प्रिंट करने के विवरण के बारे में चिंता न करें। – BenTrofatter

उत्तर

3

यहां एक विचार है: बंदर django HttpResponse क्लास को पैच करें ताकि __setitem__ विधि हेडर सेट होने पर अपवाद उठाए Vary है। जब आप इसे बनाते हैं तो आप अन्यथा ऐसा कुछ भी नहीं कर सकते हैं। यह आपको हेडर सेट करने वाली रेखा से एक अच्छा ट्रेसबैक देना चाहिए।

class MonkeyPatchMiddleware(object): 

    def __init__(self): 
     from django.http import HttpResponse 

     original_set_item = HttpResponse.__setitem__ 

     def __setitem__(self, header, value): 
      if header == "Vary": 
       raise ValueError 
      original_set_item(self, header, value) 

     HttpResponse.__setitem__ = __setitem__ 

अपने django सेटिंग्स फ़ाइल में अपने मिडलवेयर स्टैक में पहली चीज़ के रूप में मिडलवेयर स्थापित करें।

+0

धन्यवाद! मुझे मिडलवेयर जोड़ने के बजाय अपने ऐप के 'views.py' में इसे आजमाने के लिए और अधिक सुविधाजनक लगता है। ट्रेसबैक ने मुझे बताया कि यह 'सत्र Middleware.process_response' था जो 'patch_vary_headers' को कॉल कर रहा था, लेकिन फिर यह पता लगाने के लिए कि मुझे' request.session.accessed' 'सेट करने की आवश्यकता क्यों है। 'सत्र Base.accessed = संपत्ति में बंदर-पैचिंग (लैम्ब्डा स्वयं: झूठी, raise_ऑन_ट्रू) 'मुझे सही मूल कारण के साथ एक ट्रेसबैक मिला। –

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