API des vues basées sur les classes Flask

Flask fournit deux types de vues basées sur des classes, ce qui vous permet d'organiser la logique de vue de manière orientée objet.

Viewest la vue basée sur une classe la plus élémentaire,MethodViewrépartit automatiquement selon les méthodes HTTP.


Classe de base View

Attributs/Méthodes Description
methods Attribut de classe, la liste des méthodes HTTP acceptées par la vue. Par défaut None (utilise la valeur par défaut de add_url_rule)
decorators Attribut de classe, la liste des décorateurs. Appliqués dans l'ordre à la fonction de vue générée
init_every_request Attribut de classe, bool. Lorsque True (par défaut), une nouvelle instance est créée pour chaque requête ; lorsque False, une seule instance est réutilisée.
provide_automatic_options Attribut de classe, indique s'il faut implémenter automatiquement OPTIONS. Par défaut None (utilise la configuration de l'application)
dispatch_request(**kwargs) Méthode principale, doit être redéfinie. kwargs sont les variables d'URL
as_view(name, *class_args, **class_kwargs) Méthode de classe, crée une fonction de vue pouvant être utilisée dans add_url_rule

Classe MethodView

Hérite de View, dirige automatiquement vers la méthode d'instance correspondante en fonction de la méthode HTTP.

Conventions de nommage des méthodes Description
get(self, **kwargs) Gère les requêtes GET
post(self, **kwargs) Gère les requêtes POST
put(self, **kwargs) Gère les requêtes PUT
delete(self, **kwargs) Gère les requêtes DELETE
patch(self, **kwargs) Gère les requêtes PATCH

Après avoir défini ces méthodes,methodsL'attribut est automatiquement défini en fonction des méthodes définies.


View vs MethodView

Fonctionnalités Vue MethodView
Méthode de répartition Un seul dispatch_request gère toutes les méthodes Répartit automatiquement selon le nom de la méthode (get→GET, etc.)
Scénarios applicables Vues génériques, rendu de template API RESTful

Exemples de code

Exemple

from flask import Flask, request, session, redirect, url_for
from flask.views import View, MethodView

app = Flask(__name__)

# Vue de base : un seul dispatch_request
class HelloView(View):
    def dispatch_request(self, name):
        return f"<h1>Hello, {name}!</h1>"

app.add_url_rule("/hello/<name>", view_func=HelloView.as_view("hello"))

# MethodView:API RESTful
class PostAPI(MethodView):
    # Initialisation personnalisée (appelée à chaque requête)
    def __init__(self):
        self.db = get_database_connection()

    def get(self, post_id=None):
        if post_id is None:
            posts = self.db.query_all_posts()
            return {"posts": posts}
        return self.db.get_post(post_id)

    def post(self):
        data = request.json
        post_id = self.db.create_post(data["title"], data["body"])
        return {"id": post_id}, 201

    def delete(self, post_id):
        self.db.delete_post(post_id)
        return {"message": "deleted"}

# Enregistrement : la même fonction de vue gère plusieurs méthodes
post_view = PostAPI.as_view("post_api")
app.add_url_rule("/api/posts", defaults={"post_id": Aucune},
                 view_func=post_view, methods=["GET", "POST"])
app.add_url_rule("/api/posts/<int:post_id>",
                 view_func=post_view, methods=["GET", "DELETE"])
autres extensions