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:
- Como usuario final (autenticado usando una cookie de sesión) enviando un formulario. Esto requiere protección CSRF.
- 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'')