not missing incorrect forbidden disable csrfmiddlewaretoken csrf_token cookie django api csrf-protection

django - disable - forbidden(csrf token missing or incorrect.) ajax



¿Cómo puedo desactivar la protección csrf de Django solo en ciertos casos? (2)

Hay una sección de la documentación de Protección CSRF de Django titulada Ver necesita protección para una ruta que describe una solución. La idea es usar @csrf_exempt en toda la vista, pero cuando el encabezado del cliente API no está presente o no es válido, llame a una función anotada con @csrf_protect .

Intento escribir un sitio en Django, donde las URL de API son las mismas que las URL de usuario. Pero tengo problemas con páginas que usan solicitudes POST y protección CSRF. Por ejemplo, si tengo una página / foo / add, quiero poder enviarle solicitudes POST de dos maneras:

  1. Como usuario final (autenticado usando una cookie de sesión) enviando un formulario. Esto requiere protección CSRF.
  2. Como cliente API (autenticado usando un encabezado de solicitud HTTP). Esto fallará si la protección CSRF está habilitada.

He encontrado varias formas de deshabilitar CSRF, como @csrf_exempt, pero todas las deshabilitan para toda la vista. ¿Hay alguna forma de habilitarlo / deshabilitarlo a un nivel más detallado? ¿O voy a tener que implementar por propia protección CSRF desde cero?


Modificar urls.py

Si administra sus rutas en urls.py , puede ajustar sus rutas deseadas con csrf_exempt() para excluirlas del middleware de verificación CSRF.

por ejemplo,

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())) # ... )

Alternativamente, como decorador

Algunos pueden considerar que el uso del decorador @csrf_exempt más adecuado para sus necesidades

por ejemplo,

from django.views.decorators.csrf import csrf_exempt from django.http import HttpResponse @csrf_exempt def my_view(request): return HttpResponse(''Hello world'')