Tạo bằng POST
Thuộc phần API JSON trong hành trình Django của Coddy. Bài học 5 trên 19.
Chương trình có thể đọc các nhiệm vụ của bạn nhưng không thể thêm nhiệm vụ mới. Để tạo nhiệm vụ, chương trình gửi yêu cầu POST đến URL của danh sách, kèm nhiệm vụ dưới dạng JSON trong body của yêu cầu, phần dữ liệu được gửi cùng yêu cầu. Biểu mẫu điền dữ liệu vào request.POST, còn JSON thì không. Đọc phần nội dung thô bằng request.body rồi chuyển thành Python với json.loads.
Một URL có thể thực hiện hai việc, tùy theo request.method. View này chỉ phản hồi lại nội dung được gửi đến:
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"})View tạo một đối tượng sẽ phản hồi với 201 Created và đối tượng mới, để chương trình biết id của đối tượng đó.
Thanh địa chỉ chỉ gửi GET, nên bạn hãy gửi POST từ thẻ Shell. Client kiểm thử của Django gửi yêu cầu đến trang web của bạn bằng Python, còn .json() đọc phản hồi. Shell in kết quả dưới dạng từ điển Python: 'done': False, chứ không phải false của JSON.
Thử thách
Trung bìnhCho phép chương trình tạo một nhiệm vụ.
- Trong
tasks/views.py, thêmimport json. Ở đầutask_list, khi nhậnPOST, hãy tạo nhiệm vụ từtitlevàprioritytrong phần thân JSON (mặc định lànormal). - Trả về nhiệm vụ mới bằng
task_to_dictvới trạng thái201. Giữ nguyên code GET bên dưới.
Chạy dòng bên dưới trong thẻ Shell: dòng này in ra Pay rent với mức ưu tiên normal.
from django.test import Client; print(Client().post("/api/tasks/", {"title": "Pay rent"}, content_type="application/json").json())Tự làm thử
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))
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong API JSON
Tự luyện tập: Playground Django