Satu Class per Resource
Termasuk bagian API JSON dalam perjalanan Django di Coddy. Pelajaran 11 dari 19.
task_detail sekarang terdiri dari rangkaian blok if request.method == ... ditambah daftar method yang harus selalu diselaraskan. Base class Django, View, yang menjadi induk setiap generic view yang kamu gunakan, menangani pencatatan itu.
Beri class tersebut satu method untuk setiap method HTTP, dengan nama dalam huruf kecil. View memanggil method yang namanya sesuai dengan request dan memberikan respons 405 untuk request lainnya. Nilai dari URL diteruskan setelah request, seperti pada function view, dan rutenya menggunakan .as_view(). Tema warna pengunjung sebagai resource:
@method_decorator(csrf_exempt, name="dispatch")
class Theme(View):
def get(self, request):
return JsonResponse({"theme": request.session.get("theme", "light")})
def put(self, request):
data = json.loads(request.body)
request.session["theme"] = data["theme"]
return JsonResponse({"theme": data["theme"]})@csrf_exempt berfungsi pada fungsi. Pada class, method_decorator memasangnya pada dispatch, method yang dilalui setiap request.
Tantangan
SedangUbah task_detail menjadi class TaskDetail(View):
- Method
get,patch, dandelete, masing-masing melakukan hal yang sebelumnya dilakukan fungsi tersebut, termasuk respons 404. - Bebaskan dari CSRF dengan
method_decorator. - Rute menggunakan
views.TaskDetail.as_view(), dan tetap bernamatask_detail.
Tekan Jalankan, lalu buka /api/tasks/1/: task akan ditampilkan seperti sebelumnya.
Coba sendiri
import json
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_GET, require_http_methods
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()})
@require_GET
def stats(request):
data = {
"total": Task.objects.count(),
"done": Task.objects.filter(done=True).count(),
}
return JsonResponse(data)
@csrf_exempt
@require_http_methods(["GET", "POST"])
def task_list(request):
if request.method == "POST":
try:
data = json.loads(request.body)
except json.JSONDecodeError:
return JsonResponse({"error": "The body is not valid JSON."}, status=400)
errors = {}
title = data.get("title", "").strip()
if not title:
errors["title"] = "This field is required."
if errors:
return JsonResponse({"errors": errors}, status=400)
task = Task.objects.create(
title=title,
priority=data.get("priority", "normal"),
)
return JsonResponse(task_to_dict(task), status=201)
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)
@csrf_exempt
@require_http_methods(["GET", "PATCH", "DELETE"])
def task_detail(request, pk):
task = Task.objects.filter(pk=pk).first()
if task is None:
return JsonResponse({"error": "Task not found"}, status=404)
if request.method == "DELETE":
task.delete()
return HttpResponse(status=204)
if request.method == "PATCH":
data = json.loads(request.body)
if "title" in data:
task.title = data["title"]
if "done" in data:
task.done = data["done"]
task.save()
return JsonResponse(task_to_dict(task))
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di API JSON
2Membaca Permintaan
Memfilter dengan QueryMembuat dengan POST5Proyek: Mengurutkan Pekerjaan
Proyek: PrioritasProyek: Menghapus Tugas yang SelesaiLatihan sendiri: Playground Django