168 votes

Comment désactiver la validation CSRF de Django ?

J'ai commenté les lignes du processeur csrf et du middleware dans le fichier settings.py :

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 )

Mais lorsque j'utilise Ajax pour envoyer une requête, Django répond toujours 'csrf token is incorrect or missing', et après avoir ajouté X-CSRFToken aux en-têtes, la requête aboutit.

Qu'est-ce qui se passe ici ?

321voto

TheBronx Points 2218

Si vous avez juste besoin que certaines vues n'utilisent pas CSRF, vous pouvez utiliser @csrf_exempt :

from django.views.decorators.csrf import csrf_exempt

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

Vous trouverez d'autres exemples et d'autres scénarios dans la documentation de Django :

66voto

Rohit33 Points 641

Sur setting.py dans MIDDLEWARE, vous pouvez simplement supprimer/commenter cette ligne :

'django.middleware.csrf.CsrfViewMiddleware',

60voto

Martijn ten Hoor Points 319

Pour désactiver CSRF pour les vues basées sur les classes, ce qui suit a fonctionné pour moi.

J'utilise Django 1.10 et Python 3.5.2.

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

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

50voto

Madhuri Gole Points 331

Le problème ici est que SessionAuthentication effectue sa propre validation CSRF. C'est pourquoi vous obtenez l'erreur CSRF missing même si le CSRF Middleware est commenté. Vous pourriez ajouter @csrf_exempt à chaque vue, mais si vous voulez désactiver CSRF et avoir l'authentification de session pour toute l'application, vous pouvez ajouter un middleware supplémentaire comme ceci -

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

J'ai créé cette classe dans myapp/middle.py Puis j'importe ce middleware dans 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',

]

Cela fonctionne avec DRF sur django 1.11

18voto

François Points 1177

Para Django 2 :

from django.utils.deprecation import MiddlewareMixin

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

Ce middleware doit être ajouté à settings.MIDDLEWARE lorsque cela est approprié (dans vos paramètres de test par exemple).

_Note : le paramètre n'est pas appelé MIDDLEWARE_CLASSES plus._

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X