2012-07-07 14 views
22

che sto cercando di scrivere un sito Django in cui gli URL API sono gli stessi URL user-facing. Ma ho problemi con le pagine che usano le richieste POST e la protezione CSRF. Per esempio, se ho una pagina/pippo/aggiungi Voglio essere in grado di inviare le richieste POST ad esso in due modi:Come posso disabilitare la protezione csrf di Django solo in alcuni casi?

  1. Come utente finale (autenticato utilizzando un cookie di sessione) presentazione di un modulo. Ciò richiede la protezione CSRF.
  2. Come client API (autenticato utilizzando una richiesta HTTP). Questo fallirà se la protezione CSRF è abilitata.

Ho trovato vari modi per disabilitare CSRF, come @csrf_exempt, ma tutti lo disabilitano per l'intera vista. C'è un modo per abilitarlo/disabilitarlo a un livello più fine? O devo solo implementare la protezione CSRF da zero?

+1

Hai controllato [documenti di protezione csrf] (https://docs.djangoproject.com/en/dev/ref/contrib/csrf/)? – machaku

+0

Avevo letto un po 'di esso, ma chiaramente non ho letto tutti gli Scenari. Grazie! – lucas

risposta

22

v'è una sezione di documentazione CSRF protezione di Django intitolato View needs protection for one path che descrive una soluzione. L'idea è quella di utilizzare @csrf_exempt sull'intera vista, ma quando l'intestazione API client non è presente o non valido, quindi chiamare una funzione annotato con @csrf_protect.

30

Modifica urls.py

Se a gestire i percorsi in urls.py, si può avvolgere i percorsi desiderati con csrf_exempt() escluderli dalla verifica middleware CSRF.

per esempio,

from django.views.decorators.csrf import csrf_exempt 
urlpatterns = patterns(
    # ... 
    # Will exclude `/api/v1/test` from CSRF 
    url(r'^api/v1/test', csrf_exempt(TestApiHandler.as_view())) 
    # ... 
) 

In alternativa, come decoratore

Alcuni possono trovare l'uso del @csrf_exempt decoratore più adatto alle loro esigenze

per esempio,

from django.views.decorators.csrf import csrf_exempt 
from django.http import HttpResponse 

@csrf_exempt 
def my_view(request): 
    return HttpResponse('Hello world') 
Problemi correlati