Menu
CoddyTech

מחיקת משימה

חלק מהיחידה ממשקי API של JSON במסלול ה-Django של Coddy. שיעור 10 מתוך 19.

משימה שהסתיימה צריכה להיעלם, ולא רק להיות מסומנת: DELETE /api/tasks/1/ מסיר את משימה 1, ואז אין מה לשלוח בחזרה.

לשם כך יש ב-HTTP את 204 No Content: הבקשה הצליחה ולתשובה אין גוף. JsonResponse תמיד כותבת גוף, אפילו {}. HttpResponse רגילה עם סטטוס בלבד לא שולחת שום דבר נוסף:

return HttpResponse(status=204)

השאר את בדיקת 404 ראשונה, כדי שמחיקת משימה חסרה עדיין תחזיר 404.

כתובת URL אחת, שלוש שיטות: GET קוראת את המשימה, PATCH משנה אותה, DELETE מסירה אותה. כתובת URL לכל משאב, כשהשיטה משמשת כפועל, היא מה שאנשים מכנים API מסוג REST.

challenge icon

אתגר

קל

אפשר לתוכניות למחוק משימה באמצעות DELETE /api/tasks/<id>/:

  • אפשרו את "DELETE" ב־task_detail.
  • מחקו את המשימה והשיבו 204 עם גוף ריק.
  • אם המשימה חסרה, עדיין השיבו 404.

לחצו על Run, ואז בכרטיסייה Shell: הפקודה from django.test import Client; print(Client().delete("/api/tasks/1/").status_code) מדפיסה 204.

נסו בעצמכם

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))

כל השיעורים ביחידה ממשקי API של JSON

תרגלו בעצמכם: Django אונליין