Falcon – высокопроизводительный веб-фреймворк

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

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

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

Введение в Falcon

Falcon — это минималистичный и высокопроизводительный веб-фреймворк на Python, предназначенный для создания масштабируемых REST API. Он оптимизирован для низкой задержки и высокой пропускной способности, используется в микросервисах, встроенных системах, IoT, а также в корпоративных решениях, требующих стабильности и скорости.


Особенности и преимущества Falcon

  • Минимальное потребление ресурсов

  • Высокая производительность на уровне Go и Node.js

  • Чистая архитектура REST

  • Полный контроль над запросами и ответами

  • Поддержка middleware, хуков, CORS

  • Простота интеграции с SQL и NoSQL базами

  • ASGI и WSGI-совместимость (в Falcon 3+)


Сравнение Falcon с Flask и FastAPI

Характеристика Falcon Flask FastAPI
Производительность Очень высокая Средняя Высокая
Поддержка ASGI Да (3.0+) Нет (WSGI) Да
Типизация Не используется Не используется Да
Поддержка синх/асинх Да Только sync Полная async
Подходит для REST Да (лучше всех) Да Да

Установка и настройка проекта

bash
pip install falcon

Для ASGI-приложения:

bash
pip install falcon[asgi]

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

python
import falcon class HelloResource: def on_get(self, req, resp): resp.media = {'message': 'Привет, Falcon'} app = falcon.App() app.add_route('/hello', HelloResource())

Обработка GET, POST, PUT, DELETE

python
class ExampleResource: def on_get(self, req, resp): resp.media = {"method": "GET"} def on_post(self, req, resp): data = req.media resp.media = {"received": data} def on_put(self, req, resp): resp.status = falcon.HTTP_204 def on_delete(self, req, resp): resp.status = falcon.HTTP_204

Работа с параметрами запроса и маршрутизацией

Параметры строки запроса:

python
def on_get(self, req, resp): name = req.get_param('name') or 'гость' resp.text = f'Привет, {name}'

Переменные маршрута:

python
app.add_route('/user/{user_id}', UserResource) def on_get(self, req, resp, user_id): resp.media = {'user_id': user_id}

Работа с JSON, формами и сериализация

Получение данных:

python
data = req.media # автоматически парсит JSON, form-urlencoded

Ответ:

python
resp.media = {'result': 'ok'} # сериализуется в JSON

Создание ресурсов и подключение к API

Ресурсы в Falcon — это классы с методами on_get, on_post, и т.д.
Подключение маршрута:

python
app.add_route('/api/resource', MyResource())

Обработка ошибок и исключений

Пользовательское исключение:

python
class BadRequestError(falcon.HTTPBadRequest): def __init__(self): super().__init__(title='Ошибка', description='Неверный запрос')

Обработка через @app.error_handler:

python
@app.error_handler(Exception) def handle_exceptions(ex, req, resp, params): resp.status = falcon.HTTP_500 resp.media = {'error': str(ex)}

Middleware: обработка запроса и ответа

python
class AuthMiddleware: async def process_request(self, req, resp): token = req.get_header('Authorization') if not token: raise falcon.HTTPUnauthorized() app = falcon.App(middleware=[AuthMiddleware()])

Работа с CORS и заголовками

bash
pip install falcon-cors
python
from falcon_cors import CORS cors = CORS(allow_all_origins=True) app = falcon.App(middleware=[cors.middleware])

Интеграция с базами данных

Используются любые Python ORM или драйверы, например SQLAlchemy:

python
from sqlalchemy import create_engine engine = create_engine('sqlite:///db.sqlite3')

Создание подключений и передача через middleware или зависимости.


Тестирование API Falcon

bash
pip install pytest requests

Пример теста:

python
import requests def test_hello(): response = requests.get('http://localhost:8000/hello') assert response.status_code == 200 assert response.json()['message'] == 'Привет, Falcon'

Поддержка асинхронности

С Falcon 3.0+ добавлена поддержка ASGI:

python
class AsyncResource: async def on_get(self, req, resp): await asyncio.sleep(1) resp.media = {'async': True}

Развёртывание Falcon с Gunicorn и Uvicorn

Для WSGI:

bash
gunicorn app:app

Для ASGI:

bash
uvicorn app:app

Продакшн-режим:

bash
gunicorn app:app --workers 4 --bind 0.0.0.0:8000

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

  • Высокопроизводительные REST API

  • Микросервисы и шины данных

  • Сервисы сбора метрик и логов

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

  • Облачные платформы и API-шлюзы

  • IoT-решения и встраиваемые системы


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

Что такое Falcon?

Минималистичный веб-фреймворк для Python, оптимизированный для REST API и высокой производительности.

Поддерживает ли Falcon асинхронность?

Да, начиная с версии 3.0+, с поддержкой ASGI и async def.

Как Falcon работает с JSON?

Через req.media и resp.media (автоматический парсинг и сериализация).

Подходит ли Falcon для больших проектов?

Да, Falcon используется в микросервисной архитектуре и крупных API-системах.

Можно ли подключить базу данных?

Да, Falcon не навязывает ORM, можно использовать SQLAlchemy, Tortoise ORM, asyncpg и др.

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

Основы: создание приложения и маршрутов

Компонент Описание
falcon.App() Создает экземпляр Falcon-приложения.
app.add_route('/path', Resource()) Добавляет маршрут и связывает его с ресурсом.
Resource Класс с методами on_get, on_post и т.д., представляющий эндпоинт.
api = falcon.App(middleware=...) Указание middleware при создании.
python
import falcon class HelloResource: def on_get(self, req, resp): resp.text = 'Привет, Falcon!' app = falcon.App() app.add_route('/', HelloResource())

Методы HTTP-запросов

Метод Описание
on_get(self, req, resp) Обработка GET-запроса.
on_post(self, req, resp) POST-запрос.
on_put(self, req, resp) PUT-запрос.
on_delete(self, req, resp) DELETE-запрос.
on_patch(self, req, resp) PATCH-запрос.
on_head(self, req, resp) HEAD-запрос.
on_options(self, req, resp) OPTIONS-запрос.

Работа с запросами (req)

Атрибут / Метод Описание
req.method Метод HTTP (например, GET, POST).
req.path, req.url Путь и полный URL запроса.
req.headers Заголовки запроса.
req.get_param(name) Получение query-параметра.
req.media JSON-данные запроса (автоматически десериализованные).
req.stream.read() Чтение тела запроса как байтов.

Работа с ответами (resp)

Атрибут / Метод Описание
resp.status HTTP-статус ответа (falcon.HTTP_200, falcon.HTTP_404 и т.д.).
resp.text Ответ в виде строки (авто-установка content-type).
resp.media Ответ в формате JSON (сериализуется автоматически).
resp.set_header() Добавление заголовка.
resp.set_cookie() Установка куки.

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

Механизм Описание
raise falcon.HTTPBadRequest() Явное возбуждение HTTP-исключения.
falcon.HTTPError(status, title, description) Базовое исключение с кастомным сообщением.
@app.error_handler(Exception) Глобальный обработчик исключений.
python
@app.error_handler(ZeroDivisionError) def handle_zero_division(req, resp, ex, params): raise falcon.HTTPBadRequest("Ошибка деления", "Нельзя делить на ноль.")

Работа с маршрутами

Возможность Описание
'/user/{user_id}' Параметры пути.
req.context['key'] Временное хранилище между middleware и ресурсом.
app.add_route('/path', resource, suffix='custom') Позволяет использовать on_get_custom() и т.д.

Middleware (промежуточные обработчики)

Метод Описание
process_request(self, req, resp) Вызывается перед обработкой запроса.
process_response(self, req, resp, resource, req_succeeded) Вызывается после обработки.
python
class AuthMiddleware: def process_request(self, req, resp): token = req.get_header('Authorization') if token != 'valid': raise falcon.HTTPUnauthorized() app = falcon.App(middleware=[AuthMiddleware()])

Хуки

Функция Описание
@falcon.before(func) Выполняется перед методом ресурса.
@falcon.after(func) Выполняется после метода ресурса.
python
@falcon.before(lambda req, resp, resource, params: print("До вызова")) class MyResource: def on_get(self, req, resp): resp.text = "OK"

Работа с JSON

Поддержка Описание
req.media Автоматическая десериализация JSON в dict.
resp.media = {'result': 'ok'} Автоматическая сериализация в JSON.

Запуск с сервером

Сервер Команда
Gunicorn gunicorn app:app
Uvicorn (ASGI) uvicorn app:app (с Falcon >=3.0)