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"])
Другие расширения