2011-04-05 13 views
8

Django में, मैं अनुरोध और प्रतिक्रिया सामग्री की लंबाई लॉगिंग करने का प्रयास करता हूं, जो वास्तव में वही है जो Django सर्वर stderr को प्रिंट करता है।मैं Django प्रतिक्रिया ऑब्जेक्ट की सामग्री लंबाई कैसे प्राप्त करूं?

[05/Apr/2011 22:59:08] "GET /pages/ HTTP/1.1" 200 332161 
[05/Apr/2011 22:59:15] "GET /pages/12 HTTP/1.1" 301 0 
[05/Apr/2011 22:59:15] "GET /pages/12/ HTTP/1.1" 200 361474 
[05/Apr/2011 22:59:16] "GET /pages/12/load/tags/ HTTP/1.1" 200 13899 
[05/Apr/2011 22:59:16] "GET /pages/12/load/comments/ HTTP/1.1" 200 82 

तो, मैं निम्नानुसार एक साधारण मिडलवेयर लिखता हूं, लेकिन, 'सामग्री-लंबाई' का मान हमेशा खाली होता है।

class LogHttpResponse(object): 
    def process_response(self, request, response): 
     import datetime 
     print response.items() 
     time_text = datetime.datetime.now().strftime('%m/%d/%Y %H:%M:%S') 
     print '[%s] "%s %s" %d %s' % (time_text, request.method, request.path, 
             response.status_code, 
             response.get('Content-Length', '')) 
     return response 

मैं आग डिबग के माध्यम से देख लिया है, है प्रतिक्रिया हेडर में 'सामग्री-लंबाई'। लेकिन वहाँ मिडलवेयर में कोई 'सामग्री-लंबाई' है, "प्रिंट response.items()" पता चलता है:

[('Content-Type', 'text/html; charset=utf-8')] 

वहाँ मिडलवेयर आदेशों में से किसी समस्या है?

+2

यदि 'स्थानांतरण-एन्कोडिंग'' खंडित किया गया है तो कोई 'सामग्री-लंबाई' शीर्षलेख नहीं है। http://tools.ietf.org/html/rfc2616#section-4.4 –

उत्तर

6

कैसे len(response.content)? इससे आपको प्रतिक्रिया की सामग्री में वर्णों की संख्या मिल जाएगी। मुझे लगता है कि बाइट्स की संख्या के समान नहीं है।

+1

यह काम करता है। धन्यवाद। – William

+0

@ विलियम: उत्कृष्ट! –

15

मैंने अग्नि-डीबग के माध्यम से जांच की है, प्रतिक्रिया शीर्षलेखों में 'सामग्री-लंबाई' है। लेकिन मिडलवेयर में कोई 'सामग्री-लंबाई' नहीं है [...] क्या मिडलवेयर ऑर्डर की कोई समस्या है?

हां। मिडलवेयर कक्षाएं शीर्ष-डाउन (settings.MIDDLEWARE_CLASSES में) लागू होती हैं जब प्रतिक्रिया संसाधित करते समय अनुरोध और नीचे-अप प्रक्रिया होती है। यदि आपके पास मिडलवेयर कक्षाओं में 'django.middleware.http.ConditionalGetMiddleware' है तो यह HttpResponse में 'Content-Length' शीर्षलेख जोड़ देगा।

हालांकि में 'django.middleware.http.ConditionalGetMiddleware' के बाद आप अपनी मिडलवेयर कक्षा डालते हैं, तो प्रतिक्रिया के दौरान यह पहली बार लागू होगा और फिर ConditionalMiddleware लागू करें। यही कारण है कि आप फायरबग में Content-Length शीर्षलेख देखते हैं, हालांकि मिडलवेयर कहलाते समय अभी तक संसाधित नहीं किया गया है।

मिडलवेयर के बारे में अधिक जानकारी के लिए Django Middleware documentation देखें।