Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio

Deja que los programas creen una tarea.

  1. En tasks/views.py, agrega import json. Al principio de task_list, para una solicitud POST, crea la tarea a partir de title y priority del cuerpo JSON (con normal como valor predeterminado).
  2. Responde con la nueva tarea de task_to_dict y el estado 201. 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))
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de API JSON

Practica por tu cuenta: Playground de Django