2013-05-09 13 views
68

Ho commentato le linee del processore e middleware CSRF in settings.py:Come disabilitare la convalida CSRF di Django?

122 
123 TEMPLATE_CONTEXT_PROCESSORS = (
124  'django.contrib.auth.context_processors.auth', 
125 # 'django.core.context_processors.csrf', 
126  'django.core.context_processors.request', 
127  'django.core.context_processors.static', 
128  'cyathea.processors.static', 
129) 
130 
131 MIDDLEWARE_CLASSES = (
132  'django.middleware.common.CommonMiddleware', 
133  'django.contrib.sessions.middleware.SessionMiddleware', 
134 # 'django.middleware.csrf.CsrfViewMiddleware', 
135  'django.contrib.auth.middleware.AuthenticationMiddleware', 
136  'django.contrib.messages.middleware.MessageMiddleware', 
137  'django.middleware.locale.LocaleMiddleware', 
138  # Uncomment the next line for simple clickjacking protection: 
139  # 'django.middleware.clickjacking.XFrameOptionsMiddleware', 
140) 

Ma quando uso l'Ajax di inviare una richiesta, Django ancora rispondere 'CSRF token è errato o mancante', e dopo l'aggiunta di X-CSRFToken a intestazioni, la richiesta avrebbe avuto successo.

Cosa sta succedendo qui?

+0

Eventuali duplicati: http://stackoverflow.com/questions/1650941/django-csrf-framework-cannot-be-disabled-and-is-breaking-my-site – Rohan

risposta

149

Se avete solo bisogno alcuni punti di vista non utilizzare CSRF, è possibile utilizzare @csrf_exempt:

from django.views.decorators.csrf import csrf_exempt 

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

Puoi trovare altri esempi e altri scenari qui:

+2

Ciao, @TheBronx, voglio davvero sapere perché la mia soluzione non funziona. – MrROY

+1

sorry @MrROY Non so perché la tua soluzione non funziona. So solo che '@ csrf_exemp' funziona come l'ho usato di recente senza problemi. Spero che tu trovi la risposta. – TheBronx

+3

@MrROY, è una cosa di Django. La maggior parte delle cose funziona/non funziona solo perché c'è un'impostazione magica sepolta in profondità nella base del codice. – idursun

9

La risposta potrebbe essere inappropriato, ma spero che si

class DisableCSRFOnDebug(object): 
    def process_request(self, request): 
     if settings.DEBUG: 
      setattr(request, '_dont_enforce_csrf_checks', True) 

aiuta Avere middleware come questo aiuta a richieste di debug e controllare CSRF nel server di produzione.

+0

Hmm. Ho provato questo in Django 1.9.1. Rimosso il decoratore @csrf_exempt dal metodo e aggiunto il codice sopra. Ottenuto un 403 perché il cookie non era impostato. –

19

Per disabilitare CSRF per le viste basate su classi, ha funzionato per me.
Django 1.10 e pitone 3.5.2

from django.views.decorators.csrf import csrf_exempt 
from django.utils.decorators import method_decorator 

@method_decorator(csrf_exempt, name='dispatch') 
class TestView(View): 
    def post(self, request, *args, **kwargs): 
     return HttpResponse('Hello world') 
3

In setting.py in MIDDLEWARE si può semplicemente rimuovere questa riga, 'django.middleware.csrf.CsrfViewMiddleware',

+2

Non funziona per me – Nirri

4

Se volete disattivarlo in Global, è possibile scrivere un middleware personalizzato, come questo

from django.utils.deprecation import MiddlewareMixin 

class DisableCsrfCheck(MiddlewareMixin): 

    def process_request(self, req): 
     attr = '_dont_enforce_csrf_checks' 
     if not getattr(req, attr, False): 
      setattr(req, attr, True) 

quindi aggiungere questa classe youappname.middlewarefilename.DisableCsrfCheck a MIDDLEWARE_CLASSES liste, prima django.middleware.csrf.CsrfViewMiddleware

+0

Funziona, grazie – Nirri

5

È possibile disattivare il CSRF per rendere il proprio middleware:

Fai un app Django con il nome di 'Core', e fare un unico file 'utils.py' su questa applicazione e posto sotto il codice su questo file:

class DisableCSRF(object): 
    def process_request(self, request): 
     setattr(request, '_dont_enforce_csrf_checks', True) 

E includere questo middleware nel file settings.py in MIDDLEWARE_CLASSES.

'core.più

Un modo utils':

è possibile utilizzare @csrf_exempt decoratore

from django.views.decorators.csrf import csrf_exempt 
@csrf_exempt 
0

Il problema qui è che SessionAuthentication effettua la propria convalida CSRF. Questo è il motivo per cui viene visualizzato l'errore mancante CSRF anche quando viene commentato il middleware CSRF. Si potrebbe aggiungere @csrf_exempt per ogni vista, ma se si desidera disabilitare CSRF e hanno autenticazione della sessione per l'intera applicazione, è possibile aggiungere un middleware extra come questo -

class DisableCSRFMiddleware(object): 

def __init__(self, get_response): 
    self.get_response = get_response 

def __call__(self, request): 
    setattr(request, '_dont_enforce_csrf_checks', True) 
    response = self.get_response(request) 
    return response 

Ho creato questa classe in frontend/mezzo .py Poi importare questo middleware in middleware in settings.py

MIDDLEWARE = [ 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    #'django.middleware.csrf.CsrfViewMiddleware', 
    'myapp.middle.DisableCSRFMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 

] 

che funziona con DRF su Django 1.11

3

Per Django 2:

from django.utils.deprecation import MiddlewareMixin 


class DisableCSRF(MiddlewareMixin): 
    def process_request(self, request): 
     setattr(request, '_dont_enforce_csrf_checks', True) 

Questo middleware deve essere aggiunto alla settings.MIDDLEWARE quando opportuno (nelle impostazioni di test, per esempio).

Nota: l'impostazione non è più chiamata MIDDLEWARE_CLASSES.

Problemi correlati