J'ai commenté le processeur csrf et les lignes middleware dans 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 «le jeton csrf est incorrect ou manquant», et après avoir ajouté X-CSRFToken aux en-têtes, la requête réussit.
Qu'est-ce qui se passe ici ?
Réponses:
Si vous avez juste besoin de quelques vues pour ne pas utiliser CSRF, vous pouvez utiliser
@csrf_exempt
:Vous pouvez trouver plus d'exemples et d'autres scénarios dans la documentation Django:
la source
@csrf_exemp
fonctionne comme je l'ai utilisé récemment sans problème. J'espère que vous trouverez la réponse.Pour désactiver CSRF pour les vues basées sur les classes, ce qui suit a fonctionné pour moi.
Utiliser django 1.10 et python 3.5.2
la source
Dans
setting.py
MIDDLEWARE, vous pouvez simplement supprimer / commenter cette ligne:la source
Pour Django 2 :
Ce middleware doit être ajouté le
settings.MIDDLEWARE
cas échéant (dans vos paramètres de test par exemple).Remarque: le paramètre n'est plus appelé
MIDDLEWARE_CLASSES
.la source
La réponse peut être inappropriée, mais j'espère que cela vous aidera
Avoir un middleware comme celui-ci permet de déboguer les requêtes et de vérifier csrf dans les serveurs de production.
la source
Le problème ici est que SessionAuthentication effectue sa propre validation CSRF. C'est pourquoi vous obtenez l'erreur manquante CSRF même lorsque le middleware CSRF est commenté. Vous pouvez ajouter @csrf_exempt à chaque vue, mais si vous souhaitez désactiver CSRF et disposer d'une authentification de session pour l'ensemble de l'application, vous pouvez ajouter un middleware supplémentaire comme celui-ci -
J'ai créé cette classe dans myapp / middle.py Puis importez ce middleware dans Middleware dans settings.py
Cela fonctionne avec DRF sur django 1.11
la source
Si vous souhaitez le désactiver dans Global, vous pouvez écrire un middleware personnalisé, comme celui-ci
puis ajoutez cette classe
youappname.middlewarefilename.DisableCsrfCheck
auxMIDDLEWARE_CLASSES
listes, avantdjango.middleware.csrf.CsrfViewMiddleware
la source
CSRF peut être appliqué au niveau de la vue, qui ne peut pas être désactivé globalement .
Dans certains cas, c'est pénible, mais euh, "c'est pour la sécurité". Je dois conserver ces notes AAA.
https://docs.djangoproject.com/en/dev/ref/csrf/#contrib-and-reusable-apps
la source
@WoooHaaaa certains packages tiers utilisent le middleware 'django.middleware.csrf.CsrfViewMiddleware'. par exemple, j'utilise django-rest-oauth et j'ai un problème comme toi même après avoir désactivé ces choses. peut-être que ces paquets ont répondu à votre demande comme mon cas, car vous utilisez un décorateur d'authentification et quelque chose comme ça.
la source