İzin Verilen Yöntemler
Coddy'nin Django Journey'sinin JSON API'leri bölümünün bir parçası. Ders 8 / 19.
DELETE /api/tasks/ gönderildiğinde görevleri listeleyen koda düşer: 200, sanki işlem başarılı olmuş gibi. Bir şeyi silmek isteyen program, artık bunu yaptığını sanır.
Dürüst yanıt 405 Method Not Allowed olur. django.views.decorators.http içindeki dekoratörler, görünümünüz çalışmadan önce bu yanıtı verir ve görünümün kabul ettiği yöntemleri listeleyen bir Allow başlığı ekler:
@require_POST
def subscribe(request):
...
@require_http_methods(["GET", "PUT"])
def profile(request):
...require_GET ve require_POST, tek bir yöntem için kullanılan kısa biçimlerdir. Bir görünüm, @require_POST satırının üstündeki @csrf_exempt gibi, her satırda bir tane olacak şekilde iki dekoratör taşıyabilir. Bir görünümün kodunun işlem yaptığı yöntemlere tam olarak izin verin.
Görev
Kolaytasks/views.py dosyasında, bir görünümün işlemediği HTTP yöntemlerine 405 yanıtını ver. task_list, @csrf_exempt dekoratörünün altında GET ve POST yöntemlerini kabul eder. stats ve task_detail yalnızca GET yöntemini kabul eder.
Aşağıdaki satırı Shell sekmesinde çalıştır: 405 yazdırır.
from django.test import Client; print(Client().delete("/api/stats/").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 .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))
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
JSON API'leri bölümündeki tüm dersler
2İstekleri Okuma
Sorguyla FiltrelemePOST ile OluşturmaKendi başına pratik yap: Django playground