Menu
CoddyTech

POST로 생성하기

Coddy Django 여정의 JSON API 섹션에 포함된 레슨. 19개 중 5번째.

프로그램은 작업을 읽을 수 있지만 새 작업을 추가할 수는 없습니다. 작업을 만들려면 프로그램은 작업을 JSON으로 담아 요청의 본문에 넣고 목록의 URL로 POST 요청을 보냅니다. 본문은 요청과 함께 전송되는 데이터입니다. 폼은 request.POST를 채우지만, JSON은 그렇지 않습니다. 원시 본문인 request.body를 읽고 json.loads를 사용해 Python 데이터로 변환하세요.

하나의 URL이 두 가지 역할을 할 수 있으며, request.method에 따라 역할이 선택됩니다. 이 뷰는 전달받은 내용을 그대로 응답할 뿐입니다.

def echo(request):
    if request.method == "POST":
        data = json.loads(request.body)
        return JsonResponse({"you_sent": data})
    return JsonResponse({"hint": "Send me a POST"})

새 객체를 만드는 뷰는 새 객체와 함께 201 생성됨을 응답하므로 프로그램은 객체의 id를 알 수 있습니다. 프로그램이 생략할 수도 있는 키는 기본값과 함께 읽습니다. 예를 들어 data.get("colour", "black")처럼 읽습니다.

challenge icon

챌린지

중급

POST /api/tasks/를 사용해 프로그램이 작업을 만들도록 하세요:

  • {"title": "Pay rent", "priority": "high"}와 같은 JSON 본문을 읽고 작업을 만드세요. priority가 없으면 "normal"이 지정됩니다.
  • 새 작업과 상태 201로 응답하세요.
  • GET은 계속 작업을 나열하고 필터링합니다.

주소 표시줄은 GET만 보냅니다. Run을 누른 다음 Shell 탭에 다음을 입력하세요: from django.test import Client; print(Client().post("/api/tasks/", {"title": "Pay rent"}, content_type="application/json").json())

직접 해보기

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 icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

JSON API의 모든 레슨

직접 연습해 보세요: Django 플레이그라운드