Bir Görevi Silme
Coddy'nin Django Journey'sinin JSON API'leri bölümünün bir parçası. Ders 10 / 19.
Tamamlanmış bir görev yalnızca işaretlenmiş değil, ortadan kaldırılmış olmalıdır: DELETE /api/tasks/1/ 1 numaralı görevi siler ve ardından gönderilecek hiçbir şey kalmaz.
Bunun için HTTP'de 204 No Content vardır: istek başarılı olmuştur ve yanıtın gövdesi yoktur. Bir JsonResponse her zaman bir gövde yazar, {} bile. Yalnızca bir durum kodu içeren yalın bir HttpResponse başka hiçbir şey göndermez:
def mark_read(request, pk):
Notification.objects.filter(pk=pk).update(read=True)
return HttpResponse(status=204)404 kontrolünü ilk sırada tut; böylece silinecek görev yoksa yanıt yine 404 olur.
Tek URL, üç yöntem: GET görevi okur, PATCH değiştirir, DELETE siler. Her kaynak için bir URL ve fiil olarak yöntem kullanılması, insanların REST API dediği şeydir.
Görev
KolayProgramların DELETE /api/tasks/<id>/ kullanarak bir görevi silmesini sağlayın. tasks/views.py dosyasında task_detail için "DELETE" yöntemine izin verin, ardından görevi silip 204 durum koduyla ve boş bir gövdeyle yanıt verin. Görev bulunamazsa yine 404 yanıtı verilir.
Aşağıdaki satırı Shell sekmesinde iki kez çalıştırın: önce 204, sonra 404 yazdırır; çünkü 1 numaralı görev artık yoktur.
from django.test import Client; print(Client().delete("/api/tasks/1/").status_code)Kendin dene
import json
from django.http import 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"])
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 == "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))
JSON API'leri bölümündeki tüm dersler
Kendi başına pratik yap: Django playground