Wie erhalte ich die Inhaltslänge eines Django-Antwortobjekts?

8

In Django versuche ich, die Inhaltslänge der Anfrage und des Antworts zu protokollieren, was genau dem entspricht, was der Django-Server in stderr ausgibt.

%Vor%

Also schreibe ich eine einfache Middleware wie folgt, aber der Wert von 'Content-Length' ist immer leer.

%Vor%

Ich habe fire-debug überprüft, in den Antwortheadern steht . Aber in der Middleware gibt es keine "Content-Length", "print response.items ()" zeigt:

%Vor%

Gibt es ein Problem der Middleware-Bestellungen?

    
William 05.04.2011, 16:11
quelle

2 Antworten

6

Wie wäre es mit len(response.content) ? Das würde Ihnen die Anzahl der Zeichen im Inhalt der Antwort geben. Ich denke, das ist nicht unbedingt die gleiche wie die Anzahl der Bytes.

    
Paul D. Waite 05.04.2011, 16:20
quelle
15
  

Ich habe durch Fire-Debug überprüft, gibt es "Content-Length" in der   Antwortheader Aber es gibt keine Inhaltslänge in der Middleware   [...] Gibt es ein Problem der Middleware-Bestellungen?

Ja. Middlewareklassen werden von oben nach unten (in settings.MIDDLEWARE_CLASSES ) bei der Verarbeitung der Anforderung und bei der Verarbeitung der Antwort von unten nach oben angewendet. Wenn Sie in Ihren Middleware-Klassen 'django.middleware.http.ConditionalGetMiddleware' haben, fügt sie der HttpResponse einen 'Content-Length' -Header hinzu.

Wenn Sie jedoch Ihre Middleware-Klasse nach 'django.middleware.http.ConditionalGetMiddleware' in settings.MIDDLEWARE_CLASSES setzen, wird sie diese zuerst bei der Verarbeitung der Antwort anwenden und anschließend die ConditionalMiddleware anwenden. Aus diesem Grund sehen Sie in Firebug einen Header Content-Length , der beim Aufruf der Middleware noch nicht verarbeitet wurde.

Weitere Informationen zu Middleware finden Sie in der Django Middleware-Dokumentation .

    
Torsten Engelbrecht 06.04.2011 03:01
quelle