He comentado el procesador csrf y las líneas de middleware en 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 )
Pero cuando uso Ajax para enviar una solicitud, Django todavía responde 'el token csrf es incorrecto o falta', y después de agregar X-CSRFToken a los encabezados, la solicitud se realizará correctamente.
Que esta pasando aqui ?
Respuestas:
Si solo necesita algunas vistas para no usar CSRF, puede usar
@csrf_exempt
:Puede encontrar más ejemplos y otros escenarios en la documentación de Django:
fuente
@csrf_exemp
funciona ya que lo he usado recientemente sin problemas. Espero que encuentres la respuesta.Para deshabilitar CSRF para vistas basadas en clases, lo siguiente funcionó para mí.
Usando django 1.10 y python 3.5.2
fuente
En
setting.py
MIDDLEWARE, simplemente puede eliminar / comentar esta línea:fuente
Para Django 2 :
Ese middleware debe agregarse
settings.MIDDLEWARE
cuando sea apropiado (en su configuración de prueba, por ejemplo).Nota: la configuración ya no se llama
MIDDLEWARE_CLASSES
.fuente
La respuesta puede ser inapropiada, pero espero que te ayude
Tener un middleware como este ayuda a depurar solicitudes y verificar csrf en servidores de producción.
fuente
El problema aquí es que SessionAuthentication realiza su propia validación CSRF. Es por eso que obtiene el error de falta de CSRF incluso cuando se comenta el Middleware de CSRF. Puede agregar @csrf_exempt a cada vista, pero si desea deshabilitar CSRF y tener autenticación de sesión para toda la aplicación, puede agregar un middleware adicional como este:
Creé esta clase en myapp / middle.py Luego importe este middleware en Middleware en settings.py
Eso funciona con DRF en django 1.11
fuente
Si desea deshabilitarlo en Global, puede escribir un middleware personalizado, como este
luego agregue esta clase
youappname.middlewarefilename.DisableCsrfCheck
a lasMIDDLEWARE_CLASSES
listas, antesdjango.middleware.csrf.CsrfViewMiddleware
fuente
CSRF se puede aplicar a nivel de vista, que no se puede deshabilitar globalmente .
En algunos casos esto es una molestia, pero "es por seguridad". Tengo que conservar esas calificaciones AAA.
https://docs.djangoproject.com/en/dev/ref/csrf/#contrib-and-reusable-apps
fuente
@WoooHaaaa algunos paquetes de terceros utilizan el middleware 'django.middleware.csrf.CsrfViewMiddleware'. por ejemplo, uso django-rest-oauth y tengo un problema como tú incluso después de deshabilitar esas cosas. tal vez estos paquetes respondieron a su solicitud como mi caso, porque usa decorador de autenticación y algo así.
fuente