python - missing - Django REST Framework CSRF falló: la cookie CSRF no está configurada
forbidden csrf token missing or incorrect javascript (7)
Estoy utilizando el marco de descanso de django para realizar llamadas de API a través de IOS y me aparece el siguiente error: "Error de CSRF: No se ha establecido la cookie de CSRF".
Aquí está mi código API de Django:
class LoginView(APIView):
"""
List all snippets, or create a new snippet.
"""
@csrf_exempt
def get(self, request, format=None):
startups = Startup.objects.all()
serializer = StartupSerializer(startups, many=True)
return Response(serializer.data)
@csrf_exempt
def post(self, request, format=None):
profile = request.POST
....
¿Que puedo hacer?
El problema que encuentra aquí es que django para procesar su vista está usando el método as_view()
que se devolverá, no directamente el método get()
o post()
.
Por lo tanto, debe decorar su vista basada en clases de una de las siguientes maneras:
- En urls.py
urlpatterns = patterns('''', url(''^login/$'', csrf_exempt(views.LoginView.as_view())), ... )
- o en el método
dispatch()
(pre django 1.9)
from django.utils.decorators import method_decorator class LoginView(APIView): @method_decorator(csrf_exempt) def dispatch(self, *args, **kwargs): ...
- o en la propia vista de clase (desde django 1.9)
from django.utils.decorators import method_decorator @method_decorator(csrf_exempt, name=''dispatch'') class LoginView(APIView): ...
En mi caso, sucedió porque envié una solicitud de ingreso a url = '' http://example.com/list/5 '' sin barra al final. Cuando cambié url a url = '' http://example.com/list/5/ '' todo comenzó a funcionar.
Esta es una vieja pregunta, pero algo que encontramos recientemente.
DRF deshabilita CSRF de forma predeterminada, a menos que use la autenticación de sesión. Por defecto, NSURLconnection está configurado para manejar cookies. Debe indicar explícitamente a la aplicación iOS que no utilice cookies. Luego, puede seguir usando la autenticación de sesión si es necesario y no tener que eximir sus vistas por csrf.
He tenido el mismo problema. Mi problema fue que olvidé poner .as_view()
en urls.py en MyAPIView
. Así que tiene que ser como:
url(r''$'', GetLikesAPI.as_view(), name=''list'')
no:
url(r''$'', GetLikesAPI, name=''list'')
Para los GET, no debe modificar los datos, por lo que no se requiere un CSRF.
Si está modificando datos con un POST, entonces DEBE tener un CSRF si está utilizando la autenticación basada en la sesión. De lo contrario, estás abriendo un agujero de seguridad. A pesar de que cree que su servidor Django prestará servicio a las aplicaciones de iPhone, no hay nada que impida que alguien con su aplicación pueda detectar los paquetes en el tráfico de su servidor, y luego revertir el acceso de ingeniería al servidor con otros tipos de clientes web. Por esta razón, Django Rest Framework requiere un CSRF en algunos casos. Esto se menciona en la documentación del marco de descanso de Django .
La ruta alrededor de este requisito para POSTs es no usar la autenticación de sesión. Por ejemplo, podría usar la autenticación básica sobre HTTPS. Con este mecanismo de autenticación, debe usar HTTPS para evitar que las credenciales se pasen en claro con cada solicitud.
Si alguien sigue esta pregunta, la respuesta directa es que necesita usar el decorador en el método de visualización. Los métodos de get
y post
definidos en la clase APIView
simplemente le dicen a DRF cómo debe comportarse la vista real, pero el método de vista que espera el enrutador django no está realmente instanciado hasta que llama a LoginView.as_view()
.
Por lo tanto, la solución es agregar el decorador urls.py
a urls.py
Puede verse como sigue:
#file: urls.py
from django.conf.urls import patterns, url
from django.views.decorators.csrf import csrf_exempt
import views
urlpatterns = patterns('''',
url(''^login/$'', csrf_exempt(views.LoginView.as_view())),
...
)
Sin embargo, como Mark señala arriba, la protección csrf es importante para evitar que sus sesiones sean secuestradas. No he trabajado con iOS por mi cuenta, pero buscaría usar los tokens csrf basados en cookies de django . Puede usar el decorador asegurar_csrf_cookie para hacer que django envíe una cookie csrftoken
con una respuesta, y sus solicitudes POST
se validarán siempre que incluya ese token como un encabezado X-CSRFToken
.
urlpatterns = patterns('''',
url(''^login/$'', csrf_exempt(views.LoginView.as_view())),
...
)
Chicos Tuve el mismo error y pasé mucho tiempo solo para encontrar que: 1) Tuve otro enrutador con ''inicio de sesión'' y ahí me perdí ''$''. Quiero decir que a veces puedes olvidar algo en el enrutamiento y obtener este error.