Menu
CoddyTech

Metode yang Diizinkan

Termasuk bagian API JSON dalam perjalanan Django di Coddy. Pelajaran 8 dari 19.

Kirim DELETE /api/tasks/, lalu permintaan itu akan diteruskan ke kode yang mencantumkan tugas: 200, seolah-olah permintaan itu berhasil. Program yang meminta penghapusan sesuatu kini mengira bahwa tugas itu sudah dihapus.

Jawaban yang tepat adalah 405 Method Not Allowed. Dekorator di django.views.decorators.http memberikan jawaban itu sebelum view-mu dijalankan, dengan header Allow yang mencantumkan metode yang diterima view tersebut:

@require_POST
def subscribe(request):
    ...


@require_http_methods(["GET", "PUT"])
def profile(request):
    ...

require_GET dan require_POST adalah bentuk singkat untuk satu method. Sebuah view dapat menggunakan dua dekorator, masing-masing di satu baris, seperti @csrf_exempt di atas @require_POST. Izinkan hanya method yang ditangani oleh kode view.

challenge icon

Tantangan

Mudah

Berikan jawaban 405 untuk method yang tidak ditangani oleh sebuah view:

  • task_list menerima GET dan POST.
  • stats dan task_detail hanya menerima GET.

Tekan Jalankan, lalu di tab Shell: from django.test import Client; print(Client().delete("/api/stats/").status_code) mencetak 405.

Coba sendiri

import json

from django.http import JsonResponse
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt

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)


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


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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di API JSON

Latihan sendiri: Playground Django