2009-12-30 5 views
8

Ich erhalte HEAD-Anfragen in meiner Anwendung und frage mich, wie ich sie am besten behandeln kann. Die Optionen sind:Best Practice für die Behandlung der HTTP HEAD-Anfrage mit Django auf App Engine

  • wandeln sie in GETs, Prozess GET normalerweise, dann:.
    • den Körper Streifen (obwohl ich nicht sicher bin, wie - response.content = '' es nicht zu tun scheint
    • es scheint app Engine auto-Streifen den Körper, eine Warnung „Dropping unerwartete Körper als Reaktion auf HEAD-Anfrage“

Es scheint, das ist sauber und kann geschrieben werden schön wir geben Dekoratoren oder Middleware.

  • Handle jeder HEAD-Anfrage speziell:
    • dies bedeutet, dass ich ein Datastore-Zugang in einigen (vielen?) Vermeiden könnten Fälle.
    • Offensichtlich besteht die Gefahr, dass Middleware, die den Content-length-Header setzt, durch diesen Ansatz daran gehindert wird.

Sonst noch etwas? Was soll ich tun? Macht der Einsatz von App Engine hier einen Unterschied? Gibt es subtile Details? Wenn ja, gibt es eine geeignete Middleware? Um in GET zu konvertieren, ist `request.method =" GET "ausreichend (es scheint zu funktionieren)?

Antwort

10

Haben Sie vor, dass Ihre Anwendung HEAD-Anfragen bearbeitet, oder stammen diese aus einer anonymen Quelle? Sie sind sicherlich nicht verpflichtet, eine HEAD-Anfrage zu erfüllen. Sie können einfach mit einem Statuscode von 405 (Methode nicht erlaubt) zurückkehren und den Header Allow mit GET oder was immer Sie meinen, behandeln.

Ich denke nicht, dass die manuelle Einstellung von request.method zu GET sinnvoll ist; Wahrscheinlich geben Sie nur eine Antwort zurück, die größer ist als das, was der Anfragende wollte. Sie wollten nur die Header für die Antwort sehen. Wenn Sie den HEAD nicht behandeln möchten, führen Sie den 405- und Allow-Header-Ansatz aus.

Im Allgemeinen sendet ein Client eine HEAD-Anfrage, weil sie versuchen, schlau zu sein, wenn sie keine vollständige Antwort verarbeiten, wenn sie dies nicht tun müssen. Sie überprüfen, ob sich die Inhaltslänge seit dem letzten Auftreten der Antwort geändert hat, oder sie möchten den Header Last-Modified oder Expires sehen.

Es ist sicherlich gut für Ihre Anwendung, HEAD-Anfragen elegant zu behandeln, aber Sie müssen nicht.

+1

* Django entfernt automatisch den Inhalt von Antworten auf HEAD-Anfragen, während die Kopfzeilen unverändert bleiben, so dass Sie HEAD-Anfragen genauso behandeln können wie GET-Anfragen in Ihren Ansichten. * Ab Version [16115] (http: //code.djangoproject .com/changeset/16115) Django enthält einen handlichen [require_safe] (http://docs.djangoproject.com/de/dev/topics/http/decorators/#django.views.decorators.http.require_safe) Dekorator, der Anfragen einschränkt GET und HEAD. –

+1

Beachten Sie, dass die HEAD-Anfrage vollständig von einer View-Funktion verarbeitet wird (und sogar requet.GET wird ausgefüllt). Der einzige Unterschied scheint ein leerer "response.content" zu sein. –