Quart – асинхронный аналог Flask

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Введение в Quart

Quart — это асинхронный веб-фреймворк на Python, совместимый с Flask API, но основанный на asyncio. Он разработан для поддержки асинхронного программирования, обеспечивая высокую производительность и масштабируемость. Quart позволяет использовать async def во всех частях приложения: обработчиках, middleware, хуках и тестах.


Отличия Quart от Flask

Характеристика Flask Quart
Асинхронность Нет (ограничена) Полная поддержка asyncio
WebSocket Нет Да
Совместимость с Flask Да Да
Запуск WSGI ASGI (через Hypercorn)
Производительность Средняя Высокая

Quart можно использовать для тех же задач, что и Flask, но с преимуществами асинхронности.


Установка и базовая настройка

Установка Quart:

bash
pip install quart

Установка Hypercorn — сервера для запуска ASGI-приложений:

bash
pip install hypercorn

Создание первого приложения

python
from quart import Quart app = Quart(__name__) @app.route('/') async def hello(): return 'Привет от Quart' if __name__ == '__main__': app.run()

Запуск с Hypercorn:

bash
hypercorn app:app

Асинхронные маршруты и обработчики

Quart позволяет использовать async def в любом обработчике:

python
@app.route('/wait') async def wait(): await asyncio.sleep(1) return 'Асинхронная задержка выполнена'

Работа с шаблонами Jinja2

Quart использует те же шаблоны Jinja2, что и Flask:

python
from quart import render_template @app.route('/hello/<name>') async def hello_name(name): return await render_template('hello.html', name=name)

Файл templates/hello.html:

html
<h2>Привет, {{ name }}!</h2>

Обработка форм и методов POST/GET

python
from quart import request @app.route('/form', methods=['GET', 'POST']) async def form(): if request.method == 'POST': data = await request.form name = data['name'] return f'Привет, {name}' return ''' <form method="post"> <input name="name"> <input type="submit"> </form> '''

Маршруты, параметры и переменные URL

python
@app.route('/user/<int:user_id>') async def user(user_id): return f'ID пользователя: {user_id}'

Работа с JSON и API

python
from quart import jsonify @app.route('/api/data') async def api_data(): return jsonify({"name": "Quart", "version": "0.18"})

Принимаем JSON:

python
@app.route('/api/submit', methods=['POST']) async def submit(): data = await request.get_json() return jsonify({"received": data})

Поддержка WebSocket в Quart

python
from quart import websocket @app.websocket('/ws') async def ws(): while True: message = await websocket.receive() await websocket.send(f'Получено: {message}')

Работа с сессиями и cookies

python
from quart import session app.secret_key = 'секрет' @app.route('/login', methods=['POST']) async def login(): form = await request.form session['user'] = form['username'] return 'Вы вошли' @app.route('/me') async def me(): return f"Вы: {session.get('user', 'неизвестный')}"

Обработка ошибок и middleware

python
@app.errorhandler(404) async def not_found(e): return 'Страница не найдена', 404 @app.before_request async def before(): print("Запрос начался")

Асинхронная работа с базами данных

С использованием databases или asyncpg:

bash
pip install databases asyncpg
python
from databases import Database database = Database("postgresql://user:pass@localhost/dbname") @app.before_serving async def connect(): await database.connect() @app.after_serving async def disconnect(): await database.disconnect()

Фоновая обработка задач

python
@app.route('/background') async def background(): asyncio.create_task(background_task()) return 'Фоновая задача запущена' async def background_task(): await asyncio.sleep(5) print("Задача завершена")

Поддержка CORS и статических файлов

Для CORS:

bash
pip install quart-cors
python
from quart_cors import cors app = cors(app)

Для статики:

python
app = Quart(__name__, static_folder='static', static_url_path='/static')

Тестирование Quart-приложений

python
import pytest from app import app @pytest.mark.asyncio async def test_index(): test_client = app.test_client() response = await test_client.get('/') assert response.status_code == 200

Развёртывание с Hypercorn

bash
hypercorn app:app --bind 0.0.0.0:8000

Для продакшн:

bash
hypercorn app:app --workers 4 --log-level info

Примеры практического применения

  • Реализация асинхронных REST API

  • Создание интерфейсов с WebSocket

  • Лёгкие админ-панели с реальным временем

  • Бэкенды для SPA и мобильных приложений

  • Асинхронные панели мониторинга


Часто задаваемые вопросы

Что такое Quart?

Асинхронный веб-фреймворк на Python, совместимый с Flask API.

Поддерживает ли Quart шаблоны?

Да, Jinja2 используется аналогично Flask.

Поддерживает ли Quart WebSocket?

Да, полностью встроена поддержка WebSocket.

Какой сервер нужен для Quart?

Hypercorn или любой другой ASGI-совместимый сервер.

Подходит ли Quart для API?

Да, особенно для асинхронных REST и WebSocket API.

Полный справочник по ключевым функциям и структуре фреймворка Quart для Python

Установка

bash
pip install quart

Основные особенности

Особенность Описание
Асинхронность Использует async def, работает с await.
Совместимость с Flask Большинство расширений Flask поддерживаются.
Поддержка WebSocket Встроенно и нативно.
SSE, фоновые задачи Прямо в ядре фреймворка.
Совместимость с ASGI Можно запускать через hypercorn или uvicorn.

Простой пример приложения

python
from quart import Quart app = Quart(__name__) @app.route('/') async def hello(): return 'Привет, Quart!' if __name__ == '__main__': app.run()

Запуск приложения

bash
python app.py

Или через hypercorn (рекомендуется):

bash
pip install hypercorn hypercorn app:app

Роутинг и обработка запросов

python
from quart import request @app.route('/form', methods=['POST']) async def handle_form(): data = await request.form return f"Имя: {data['name']}"

Доступ к данным

Источник Как получить
GET-параметры request.args.get('key')
POST-форма await request.form
JSON await request.get_json()
Заголовки request.headers

Ответы и шаблоны

python
from quart import render_template @app.route('/page') async def page(): return await render_template('page.html', name="Quart")

Работа с сессиями и куки

python
from quart import session app.secret_key = 'секрет' @app.route('/set/') async def set_session(): session['user'] = 'admin' return 'Сессия установлена' @app.route('/get/') async def get_session(): return f"Пользователь: {session.get('user')}"

Статические файлы

python
# Файлы в папке /static доступны по адресу /static/...

Работа с WebSocket

python
from quart import websocket @app.websocket('/ws') async def ws(): while True: data = await websocket.receive() await websocket.send(f"Получено: {data}")

Middleware

Quart поддерживает ASGI middleware:

python
@app.before_request async def before(): print("Запрос получен") @app.after_request async def after(response): print("Ответ отправлен") return response

Пример: JSON API

python
@app.route('/api/data') async def api_data(): return {'status': 'ok', 'data': [1, 2, 3]}

Подключение к базам данных

Используются асинхронные библиотеки:

БД Рекомендованная библиотека