2009-12-30 9 views
8

Ricevo richieste HEAD nella mia applicazione e mi chiedo quale sia il modo migliore per gestirle. Le opzioni sono:Best practice per la gestione della richiesta HEAD HTTP con Django su App Engine

  • convertirli in Gets, processo GET normalmente, quindi:.
    • spellare il corpo (anche se non sono sicuro di come - response.content = '' non sembra farlo
    • esso sembra auto-strisce App engine il corpo, dando un avvertimento "Dropping corpo inaspettato in risposta alla richiesta HEAD"

sembra che questo è pulito, e può essere scritta noi ben decoratori o middleware.

  • gestire ogni richiesta HEAD appositamente:
    • questo significa ho potuto evitare un accesso DataStore in alcuni (molti?) Casi.
    • Esiste il rischio, apparentemente, che il middleware che imposta l'intestazione Content-length sia impedito da tale approccio.

C'è altro? Quale dovrei fare? L'utilizzo di App Engine fa la differenza qui? Ci sono dettagli sottili? se è così, c'è il middleware appropriato da usare? Per convertire in GET, `request.method =" GET "è sufficiente (sembra funzionare)?

risposta

10

Intendevi che l'applicazione gestisse le richieste HEAD o provenissero da una fonte anonima? Sicuramente non sei obbligato ad onorare una richiesta HEAD. Puoi tornare con un codice di stato 405 (metodo non consentito) e fornire l'intestazione Allow con GET o qualsiasi altra cosa tu voglia gestire.

Non penso che impostare manualmente request.method su GET sia significativo; con tutta probabilità, stai solo restituendo una risposta più grande di quella richiesta dal richiedente. Volevano solo vedere le intestazioni per la risposta. Se non si desidera gestire l'HEAD, eseguire l'approccio di intestazione 405 e Consenti.

In genere, un client invia una richiesta HEAD perché sta cercando di essere intelligente nel non gestire una risposta completa se non è necessario. Stanno verificando se il Content-Length è cambiato dall'ultima volta in cui hanno visto la risposta o se vogliono vedere l'intestazione Last-Modified or Expires.

È certamente un buon comportamento per l'applicazione gestire con grazia le richieste HEAD, ma non è necessario.

+1

* Django elimina automaticamente il contenuto delle risposte alle richieste HEAD lasciando invariate le intestazioni, pertanto è possibile gestire le richieste HEAD esattamente come le richieste GET nelle viste. * A partire dalla revisione [16115] (http: //code.djangoproject .com/changeset/16115) Django contiene utile [require_safe] (http://docs.djangoproject.com/en/dev/topics/http/decorators/#django.views.decorators.http.require_safe) decoratore, che limita le richieste PER OTTENERE E TESTA. –

+1

Si noti inoltre che la richiesta HEAD è completamente elaborata da una funzione di visualizzazione (e anche requet.GET verrà popolata). L'unica differenza sembra essere un 'response.content' vuoto. –

Problemi correlati