Crear con POST
Parte de la sección API JSON del Journey de Django de Coddy. Lección 5 de 19.
Los programas pueden leer tus tareas, pero no añadir ninguna. Para crear una, un programa envía una solicitud POST a la URL de la lista con la tarea en formato JSON en el body de la solicitud, los datos que viajan con ella. Un formulario rellena request.POST; JSON no lo hace. Lee el cuerpo sin procesar, request.body, y conviértelo a Python con json.loads.
Una URL puede hacer dos cosas, según request.method. Esta vista solo repite lo que se le envió:
import json
def echo(request):
if request.method == "POST":
data = json.loads(request.body)
return JsonResponse({"you_sent": data})
return JsonResponse({"hint": "Send me a POST"})Una vista que crea algo responde con 201 Created y el nuevo objeto, para que el programa conozca su id.
La barra de direcciones solo envía solicitudes GET, así que probarás un POST desde la pestaña Shell. El Client de pruebas de Django envía una solicitud a tu sitio desde Python, y .json() lee la respuesta. La Shell la muestra como un diccionario de Python: 'done': False, no como el false de JSON.
Desafío
IntermedioDeja que los programas creen una tarea.
- En
tasks/views.py, agregaimport json. Al principio detask_list, para una solicitudPOST, crea la tarea a partir detitleyprioritydel cuerpo JSON (connormalcomo valor predeterminado). - Responde con la nueva tarea de
task_to_dicty el estado201. Mantén debajo el código GET.
Ejecuta la línea de abajo en la pestaña Shell: imprime Pay rent con prioridad normal.
from django.test import Client; print(Client().post("/api/tasks/", {"title": "Pay rent"}, content_type="application/json").json())Pruébalo tú mismo
from django.http import JsonResponse
from django.shortcuts import render
from .models import Task
def task_to_dict(task):
return {
"id": task.id,
"title": task.title,
"done": task.done,
"priority": task.priority,
}
def home(request):
return render(request, "tasks/home.html", {"tasks": Task.objects.all()})
def stats(request):
data = {
"total": Task.objects.count(),
"done": Task.objects.filter(done=True).count(),
}
return JsonResponse(data)
def task_list(request):
tasks = Task.objects.all()
done = request.GET.get("done")
if done == "true":
tasks = tasks.filter(done=True)
elif done == "false":
tasks = tasks.filter(done=False)
return JsonResponse([task_to_dict(task) for task in tasks], safe=False)
def task_detail(request, pk):
task = Task.objects.filter(pk=pk).first()
if task is None:
return JsonResponse({"error": "Task not found"}, status=404)
return JsonResponse(task_to_dict(task))
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de API JSON
2Lectura de solicitudes
Filtrar con una consultaCrear con POST5Proyecto: Organizar el trabajo
Proyecto: PrioridadesProyecto: Borrar las tareas completadasPractica por tu cuenta: Playground de Django