Méthodes autorisées
Fait partie de la section API JSON du Journey Django de Coddy. Leçon 8 sur 19.
Envoyez DELETE /api/tasks/ et la requête aboutit au code qui liste les tâches : 200, comme si elle avait fonctionné. Un programme qui a demandé la suppression de quelque chose croit maintenant que c’est fait.
La réponse honnête est 405 Method Not Allowed. Les décorateurs de django.views.decorators.http la renvoient avant l’exécution de votre vue, avec un en-tête Allow qui répertorie les méthodes acceptées par la vue :
@require_POST
def subscribe(request):
...
@require_http_methods(["GET", "PUT"])
def profile(request):
...require_GET et require_POST sont les formes abrégées pour une seule méthode. Une vue peut avoir deux décorateurs, un par ligne, comme @csrf_exempt au-dessus de @require_POST. N’autorisez que les méthodes pour lesquelles le code d’une vue effectue une action.
Défi
FacileDans tasks/views.py, renvoie le code 405 pour les méthodes qu’une vue ne prend pas en charge. task_list accepte GET et POST, grâce à son @csrf_exempt. stats et task_detail acceptent uniquement GET.
Exécute la ligne ci-dessous dans l’onglet Shell : elle affiche 405.
from django.test import Client; print(Client().delete("/api/stats/").status_code)Essayez vous-même
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))
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de API JSON
2Lire les requêtes
Filtrer avec une requêteCréer avec POST5Projet : Trier le travail
Projet : Les prioritésProjet : Effacer les tâches terminéesEntraînez-vous par vous-même : Playground Django