API de vistas de clase de Flask
Flask proporciona dos tipos de vistas de clase, que te permiten organizar la lógica de las vistas de forma orientada a objetos.
ViewEs la vista de clase más básica,MethodViewDistribuye automáticamente según el método HTTP.
Clase base View
| Atributos/Métodos | Descripción |
|---|---|
| methods | Atributo de clase, lista de métodos HTTP que acepta la vista. Por defecto None (usa el valor predeterminado de add_url_rule) |
| decorators | Atributo de clase, lista de decoradores. Se aplican en orden a la función de vista generada |
| init_every_request | Atributo de clase, bool. Si es True (por defecto), se crea una nueva instancia por cada solicitud; si es False, se reutiliza una única instancia |
| provide_automatic_options | Atributo de clase, si se implementa automáticamente OPTIONS. Por defecto None (usa la configuración de la aplicación) |
| dispatch_request(**kwargs) | Método principal, debe ser sobrescrito. kwargs son las variables de la URL |
| as_view(name, *class_args, **class_kwargs) | Método de clase, crea la función de vista que se puede usar en add_url_rule |
Clase MethodView
Hereda de View, distribuye automáticamente según el método HTTP al método de instancia correspondiente.
| Regla de nomenclatura de métodos | Descripción |
|---|---|
| get(self, **kwargs) | Maneja solicitudes GET |
| post(self, **kwargs) | Maneja solicitudes POST |
| put(self, **kwargs) | Maneja solicitudes PUT |
| delete(self, **kwargs) | Maneja solicitudes DELETE |
| patch(self, **kwargs) | Maneja solicitudes PATCH |
Después de definir estos métodos,methodsel atributo se establece automáticamente según los métodos definidos.
View vs MethodView
| Características | View | MethodView |
|---|---|---|
| Método de distribución | Un único dispatch_request maneja todos los métodos | Distribución automática por nombre de método (get→GET, etc.) |
| Escenario de aplicación | Vistas genéricas, renderizado de plantillas | RESTful API |
Ejemplo de código
Ejemplo
from flask import Flask, request, session, redirect, url_for
from flask.views import View, MethodView
app = Flask(__name__)
# Vista básica: un único 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:RESTful API
class PostAPI(MethodView):
# Inicialización personalizada (se llama cada solicitud)
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"}
# Registro: la misma función de vista maneja múltiples métodos
post_view = PostAPI.as_view("post_api")
app.add_url_rule("/api/posts", defaults={"post_id": None},
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__)
# Vista básica: un único 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:RESTful API
class PostAPI(MethodView):
# Inicialización personalizada (se llama cada solicitud)
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"}
# Registro: la misma función de vista maneja múltiples métodos
post_view = PostAPI.as_view("post_api")
app.add_url_rule("/api/posts", defaults={"post_id": None},
view_func=post_view, methods=["GET", "POST"])
app.add_url_rule("/api/posts/<int:post_id>",
view_func=post_view, methods=["GET", "DELETE"])