Flask API представлений на основе классов
Flask предоставляет два вида представлений на основе классов, позволяя организовывать логику представлений объектно-ориентированным способом.
View— самое базовое представление на основе класса,MethodViewавтоматически выполняет диспетчеризацию в соответствии с HTTP-методами.
Базовый класс View
| Атрибуты/Методы | Описание |
|---|---|
| methods | Атрибут класса, список HTTP-методов, принимаемых представлением. По умолчанию None (использует значение по умолчанию add_url_rule) |
| decorators | Атрибут класса, список декораторов. Применяются по порядку к сгенерированной функции представления |
| init_every_request | Атрибут класса, bool. Если True (по умолчанию), для каждого запроса создаётся новый экземпляр; если False, повторно используется один экземпляр. |
| provide_automatic_options | Атрибут класса, указывающий, следует ли автоматически реализовывать OPTIONS. По умолчанию None (использует конфигурацию приложения) |
| dispatch_request(**kwargs) | Основной метод, должен быть переопределён. kwargs — это переменные URL |
| as_view(name, *class_args, **class_kwargs) | Метод класса, создаёт функцию представления, которую можно использовать в add_url_rule |
Класс MethodView
Наследуется от View и автоматически вызывает соответствующий метод экземпляра в зависимости от HTTP-метода.
| Соглашения об именовании методов | Описание |
|---|---|
| get(self, **kwargs) | Обрабатывает GET-запросы |
| post(self, **kwargs) | Обрабатывает POST-запросы |
| put(self, **kwargs) | Обрабатывает PUT-запросы |
| delete(self, **kwargs) | Обрабатывает запросы DELETE |
| patch(self, **kwargs) | Обрабатывает запросы PATCH |
После определения этих методов,methodsАтрибут автоматически устанавливается на основе определённых методов.
View против MethodView
| Особенности | Представление | MethodView |
|---|---|---|
| Метод диспетчеризации | Один dispatch_request обрабатывает все методы | Автоматически выполняет диспетчеризацию по имени метода (get→GET, и т. д.) |
| Применимые сценарии | Обобщённые представления, рендеринг шаблонов | RESTful API |
Примеры кода
Пример
from flask import Flask, request, session, redirect, url_for
from flask.views import View, MethodView
app = Flask(__name__)
# Базовое представление: один dispatch_request
class HelloView(View):
def dispatch_request(self, name):
return f"<h1>Привет, {name}!</h1>"
app.add_url_rule("/hello/<name>", view_func=HelloView.as_view("hello"))
# MethodView:RESTful API
class PostAPI(MethodView):
# Пользовательская инициализация (вызывается при каждом запросе)
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"}
# Регистрация: одна и та же функция представления обрабатывает несколько методов
post_view = PostAPI.as_view("post_api")
app.add_url_rule("/api/posts", defaults={"post_id": Отсутствует},
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__)
# Базовое представление: один dispatch_request
class HelloView(View):
def dispatch_request(self, name):
return f"<h1>Привет, {name}!</h1>"
app.add_url_rule("/hello/<name>", view_func=HelloView.as_view("hello"))
# MethodView:RESTful API
class PostAPI(MethodView):
# Пользовательская инициализация (вызывается при каждом запросе)
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"}
# Регистрация: одна и та же функция представления обрабатывает несколько методов
post_view = PostAPI.as_view("post_api")
app.add_url_rule("/api/posts", defaults={"post_id": Отсутствует},
view_func=post_view, methods=["GET", "POST"])
app.add_url_rule("/api/posts/<int:post_id>",
view_func=post_view, methods=["GET", "DELETE"])