Lo siento si esta es una pregunta de novato, estoy creando una aplicación Django y para eso estoy tratando de acceder a los datos recibidos de la solicitud POST, usando la API de recuperación de JavaScript, pero se muestra vacío. No puedo entender cuál es mi error. He intentado eliminar todas las partes innecesarias para depurar. El error está en esta parte:
Código de mis views.py
def checkdb(request): if request.method == "POST": a = request.POST.get('tag', 'default') print("printing", a) print(request.POST) return HttpResponse("Hello") def check(request): return render(request, 'shop/new.html') Código de URLS.py
urlpatterns = [ path('', views.index, name="shop"), path('checkdb/', views.checkdb, name="checkdb"), path('check/', views.check, name="check"), ] Código de new.html , solo tiene una etiqueta de secuencia de comandos para obtener la solicitud solo con fines de prueba.
<script> data = JSON.stringify({ headline: "Testing", tag: "Testing", background_image: "Testing", content: "Testing", user: 1 }) let csrftoken = getCookie('csrftoken'); let response = fetch("/shop/checkdb/", { method: 'POST', body: data, headers: { 'Accept': 'application/json, text/plain, */*', 'Content-Type': 'application/json', "X-CSRFToken": csrftoken }, }) function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie !== '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = cookies[i].trim(); if (cookie.substring(0, name.length + 1) === (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } </script>Cuando voy a la tienda/comprobación del punto final, se ejecuta su etiqueta de secuencia de comandos y no hay ningún error en la consola, pero cuando intento imprimir los datos recibidos en la terminal, siempre imprime la opción predeterminada. No obtengo el error. Quiero imprimir los datos. correspondiente a la tecla "etiqueta" que es "Prueba" pero está dando la opción predeterminada Por favor, ayúdenme a encontrar mi error.
SALIDA en terminal
Quit the server with CTRL-BREAK. [01/May/2020 19:09:02] "GET /shop/check/ HTTP/1.1" 200 1091 printing default <QueryDict: {}> [01/May/2020 19:09:02] "POST /shop/checkdb/ HTTP/1.1" 200 5Estoy usando Django 3.0.4.
Gracias y perdón si hay algún error tonto, soy un novato en Django
En mi experiencia, los datos enviados mediante fetch no se encuentran dentro de request.POST sino dentro de request.body . Luego, hay casos en los que los datos recibidos están en bytes, por lo que primero deberá decodificarlos. Te sugiero que hagas esto primero:
if request.method == "POST": import json post_data = json.loads(request.body.decode("utf-8")) Luego intente acceder al contenido de post_data como un diccionario de Python normal para obtener el valor de la tag como en post_data.get("tag")
Según mi solicitud de investigación. POST no funcionará, solo funciona cuando hay datos de formulario, resolví mi problema de acceder a los datos usando
data = json.loads(request.body.decode("utf-8")) tag = data['tag'] print(data) print(tag) Y para usar json.loads() primero debe import json .
Según la documentación :
json.loads()Deserialize s (una instancia de str, bytes o bytearray que contiene un documento JSON) a un objeto de Python utilizando esta tabla de conversión.
Los datos dentro de request.body son de tipo bytes . Como json.loads ya acepta el tipo de datos de bytes , no necesitamos decode . Entonces, simplemente podemos escribir:
data = json.loads(request.data) print(data) # We get data as a dictionary