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"])
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"])