Wie bekomme ich die Länge des Inhalts einer Django-response-Objekt?
In Django, ich versuche zur Protokollierung der Anfrage-und Antwort-Inhalt-Länge, die genau das gleiche wie das, was Django server gibt auf stderr.
[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
So, ich Schreibe eine einfache middleware wie folgt, aber der Wert von 'Content-Length' ist immer leer.
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
Habe ich überprüft durch Feuer-debug, es ist die 'Content-Length' in den response Header. Aber es gibt keine 'Content-Length' in der middleware, "print-Reaktion.Elemente()" zeigt:
[('Content-Type', 'text/html; charset=utf-8')]
Ist es ein problem der middleware-Bestellungen?
- Wenn die
Transfer-Encoding
istchunked
dann gibt es keineContent-Length
header. tools.ietf.org/html/rfc2616#section-4.4
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie etwa
len(response.content)
? Das würd geben Sie die Anzahl der Zeichen im Inhalt der Antwort. Ich denke, das ist nicht unbedingt die gleiche wie die Anzahl von bytes.Ja. Middleware-Klassen angewendet werden und von oben nach unten (in
settings.MIDDLEWARE_CLASSES
) bei der Bearbeitung von Anfrage-und bottom-up bei der Verarbeitung der Antwort. Wenn Sie'django.middleware.http.ConditionalGetMiddleware'
Sie in middleware-Klassen es wird ein'Content-Length'
header an die HttpResponse.Obwohl, wenn Sie Ihre middleware-Klasse nach
'django.middleware.http.ConditionalGetMiddleware'
imsettings.MIDDLEWARE_CLASSES
es gilt, diese zunächst bei der Verarbeitung der Antwort-und dann gelten dieConditionalMiddleware
danach. Das ist, warum Sie sehen, einContent-Length
header in Firebug, obwohl seine noch nicht verarbeitet, wenn Sie Middleware genannt.Sehen Django-Middleware-Dokumentation für weitere Informationen über die Middleware ist.