JSON Doğrulama Hataları
Coddy'nin Django Journey'sinin JSON API'leri bölümünün bir parçası. Ders 7 / 19.
Şu anda başlıksız bir POST, KeyError hatasına neden oluyor ve Django 500 Sunucu Hatası yanıtını veriyor; bu da programa neyin düzeltilmesi gerektiği hakkında hiçbir bilgi vermiyor.
Sorun verilerde olduğunda 400 Hatalı İstek yanıtını ver ve Django formunun hatalarını tuttuğu gibi, her alan için bir mesaj olacak şekilde JSON'da neyin yanlış olduğunu belirt. Bir kitapçının kitabın yılını kontrol etmesi:
errors = {}
year = data.get("year")
if not isinstance(year, int) or year < 0:
errors["year"] = "Enter the year as a whole number."
if errors:
return JsonResponse({"errors": errors}, status=400)İki tuzak daha var. Yalnızca boşluklardan oluşan bir başlık boş değildir, ancak " ".strip() sonucu "" olur. JSON olmayan bir gövde, json.loads işlevinin json.JSONDecodeError hatası vermesine neden olur. Bunu try ve except ile yakala ve çökme yerine 400 yanıtı ver.
Görev
OrtaPOST /api/tasks/ uç noktasının hatalı verileri 400 durum koduyla reddetmesini sağla.
task_listiçinde,json.loadsçevresindejson.JSONDecodeErrorhatasını yakala ve{"error": "The body is not valid JSON."}yanıtını döndür.- Başlık eksikse veya başındaki ve sonundaki boşluklar kaldırıldıktan sonra boşsa hiçbir şey kaydetme ve
{"errors": {"title": "This field is required."}}yanıtını döndür. - Aksi takdirde, başındaki ve sonundaki boşlukları kaldırılmış başlıkla görevi oluştur.
Shell sekmesinde aşağıdaki satır This field is required. çıktısını verir.
from django.test import Client; print(Client().post("/api/tasks/", {"title": " "}, content_type="application/json").json())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":
data = json.loads(request.body)
task = Task.objects.create(
title=data["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))
JSON API'leri bölümündeki tüm dersler
2İstekleri Okuma
Sorguyla FiltrelemePOST ile OluşturmaKendi başına pratik yap: Django playground