Промежуточное ПО и расширения Flask

В Flask промежуточное ПО и расширения — это два ключевых механизма для улучшения и расширения функциональности приложения.

С помощью промежуточного ПО и расширений можно значительно улучшить функциональность и гибкость приложений Flask, позволяя им удовлетворять различные сложные требования.

Далее подробно описаны концепции обоих механизмов и способы их использования.

Промежуточное ПО Flask:

  • Используйте хуки запросов для вставки кода на различных этапах обработки запроса.
  • Создавайте собственные классы промежуточного ПО для обработки запросов и ответов.

Расширения Flask:

  • Используйте существующие расширения (такие как Flask-SQLAlchemy, Flask-WTF) для добавления функциональности.
  • Создавайте пользовательские расширения для удовлетворения конкретных потребностей.

1. Промежуточное ПО Flask

Промежуточное ПО Flask — это хук для обработки запросов и ответов, обычно используемый для выполнения операций до того, как запросы достигнут функций представления, или до того, как ответы будут отправлены клиентам. Промежуточное ПО можно использовать для логирования, изменения запросов, изменения ответов и многого другого.

1.1 Хуки запросов

Хуки запросов позволяют вставлять код на разных этапах обработки запроса. Flask предоставляет несколько хуков для обработки разных этапов жизненного цикла запроса:

  • before_request: Выполняется перед обработкой каждого запроса.
  • after_request: Выполняется после обработки каждого запроса.
  • teardown_request: Выполняется после завершения обработки запроса независимо от того, возникает ли исключение.
  • before_first_request: Выполняется только перед обработкой приложением первого запроса.

Код файла app.py:

Пример

from flask import Flask, request

app = Flask(__name__)

@app.before_request
def before_request():
    print('Before request')

@app.after_request
def after_request(response):
    print('After request')
    return response

@app.teardown_request
def teardown_request(exception):
    print('Teardown request')

@app.route('/')
def index():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(debug=True)
  • @app.before_request: Вывести "Before request" перед обработкой каждого запроса.
  • @app.after_request: Вывести "After request" после обработки каждого запроса.
  • @app.teardown_request: Вывести "Teardown request" после обработки каждого запроса, независимо от того, возникает ли исключение.

1.2 Пользовательское промежуточное ПО

Flask также позволяет создавать собственные классы промежуточного ПО, которые могут работать на различных этапах обработки запросов и ответов.

Код файла middleware.py:

Пример

class CustomMiddleware:
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        def custom_start_response(status, headers):
            headers.append(('X-Custom-Header', 'Value'))
            return start_response(status, headers)

        return self.app(environ, custom_start_response)

Код файла app.py:

Пример

from flask import Flask
from middleware import CustomMiddleware

app = Flask(__name__)

app.wsgi_app = CustomMiddleware(app.wsgi_app)

@app.route('/')
def index():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(debug=True)

CustomMiddleware: Класс пользовательского промежуточного ПО, который добавляет пользовательский заголовок ответа.

2. Расширения Flask

Расширения Flask — это плагины, используемые для добавления функциональности приложениям Flask. Расширения Flask могут интегрировать сторонние библиотеки, предоставляя такие возможности, как интеграция с базами данных, обработка форм, аутентификация пользователей и многое другое.

2.1 Распространённые расширения Flask

  • Flask-SQLAlchemy: Интегрирует ORM SQLAlchemy, делая операции с базой данных более удобными.
  • Flask-WTF: Интегрирует библиотеку форм WTForms, упрощая обработку форм.
  • Flask-Login: Обеспечивает управление пользовательскими сессиями и функциональность аутентификации пользователей.
  • Flask-Migrate: Расширение для миграций базы данных, основанное на Alembic.
  • Flask-Mail: Используется для отправки электронных писем.

2.2 Установка и использование расширений Flask

В качестве примера возьмём Flask-SQLAlchemy, установка:

pip install flask-sqlalchemy

Конфигурация и использование, код файла app.py:

Пример

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)

@app.route('/')
def index():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(debug=True)

Расширение SQLAlchemy интегрирует SQLAlchemy, позволяя легко определять модели и взаимодействовать с базой данных.

2.3 Создание пользовательских расширений

Если существующие расширения не отвечают вашим потребностям, вы можете создать собственное расширение. Создание пользовательского расширения обычно включает определение класса, который предоставляет конфигурацию инициализации и связанную функциональность.

код файла myextension.py:

Пример

class MyExtension:
    def __init__(self, app=None):
        if app is not None:
            self.init_app(app)

    def init_app(self, app):
        app.config.setdefault('MY_EXTENSION_CONFIG', 'default_value')
        app.after_request(self.after_request)

    def after_request(self, response):
        response.headers['X-My-Extension'] = 'MyValue'
        return response

Код файла app.py:

Пример

from flask import Flask
from myextension import MyExtension

app = Flask(__name__)
my_ext = MyExtension(app)

@app.route('/')
def index():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(debug=True)

MyExtension: Пользовательское расширение, добавляющее пользовательский заголовок ответа.

Другие расширения