¿Qué estoy tratando de hacer?
Estoy tratando de enviar una solicitud de publicación con datos a una vista de Django usando una API de búsqueda como esta:
JavaScript:
const data = { search_text: "", months: 6, property_type: "all" }; const headers = { 'Accept': 'application/json', 'Content-Type':'application/json', 'X-Requested-With':'XMLHttpRequest' } fetch("some-url", {method: "POST", headers: headers, body: JSON.stringify(data)}) .then((response) => response.json()) .then((data) => console.log(data));vistas.py:
class MyView(View): def post(self, request, *args, **kwargs): print("request: ", request.POST) # do stuff with post dataurls.py:
re_path(r"^my_view/$", login_required(csrf_exempt(MyView.as_view())), name="my_view"),Problema
Cuando trato de acceder a los datos de la publicación en mi vista de Django, obtengo QueryDict vacío y el resultado de la terminal es este:
request: <QueryDict: {}> [06/Jan/2022 06:48:19] "POST /my_app/my_view/ HTTP/1.1" 200 114 Forbidden (CSRF token missing or incorrect.): /inbox/notifications/api/unread_list/ [06/Jan/2022 06:48:22] "{"search_text":"","months":"6","property_type":"all"}GET /inbox/notifications/api/unread_list/?max=5 HTTP/1.1" 403 12291 Si nota que en la última línea los datos de la publicación parecen agregarse en la terminal, ¿por qué sucede eso? ¿También por qué obtengo Prohibido (falta el token CSRF o es incorrecto) incluso cuando estoy usando csrf_exempt en las URL?
He intentado buscarlo y nada parece funcionar. Estamos usando reaccionar y sé que axios también se puede usar, pero debería funcionar con la API de recuperación. ¿Por qué no funciona? Por favor, ayuda.
Editar:
Incluso después de agregar el token csrf como se menciona en los documentos y eliminar csrf_exempt de las direcciones URL, sigo teniendo el mismo problema.
Esto se debe a que su vista está protegida por un CSRF -protection-middleware.
Tienes dos posibilidades:
De acuerdo, solucionó el problema, parece que los datos que estaba buscando no estaban en request.POST , sino en request.body hizo los siguientes cambios:
import json class MyView(View): def post(self, request, *args, **kwargs): print("request: ", json.loads(request.body)) # do stuff with post data request.body devuelve una cadena de bytes, por lo que debe convertir eso a json con json.loads para obtener más información, lea los documentos