Введение в 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 | Да (лучше всех) | Да | Да |
Установка и настройка проекта
pip install falcon
Для ASGI-приложения:
pip install falcon[asgi]
Создание первого Falcon-приложения
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
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
Работа с параметрами запроса и маршрутизацией
Параметры строки запроса:
def on_get(self, req, resp):
name = req.get_param('name') or 'гость'
resp.text = f'Привет, {name}'
Переменные маршрута:
app.add_route('/user/{user_id}', UserResource)
def on_get(self, req, resp, user_id):
resp.media = {'user_id': user_id}
Работа с JSON, формами и сериализация
Получение данных:
data = req.media # автоматически парсит JSON, form-urlencoded
Ответ:
resp.media = {'result': 'ok'} # сериализуется в JSON
Создание ресурсов и подключение к API
Ресурсы в Falcon — это классы с методами on_get
, on_post
, и т.д.
Подключение маршрута:
app.add_route('/api/resource', MyResource())
Обработка ошибок и исключений
Пользовательское исключение:
class BadRequestError(falcon.HTTPBadRequest):
def __init__(self):
super().__init__(title='Ошибка', description='Неверный запрос')
Обработка через @app.error_handler
:
@app.error_handler(Exception)
def handle_exceptions(ex, req, resp, params):
resp.status = falcon.HTTP_500
resp.media = {'error': str(ex)}
Middleware: обработка запроса и ответа
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 и заголовками
pip install falcon-cors
from falcon_cors import CORS
cors = CORS(allow_all_origins=True)
app = falcon.App(middleware=[cors.middleware])
Интеграция с базами данных
Используются любые Python ORM или драйверы, например SQLAlchemy:
from sqlalchemy import create_engine
engine = create_engine('sqlite:///db.sqlite3')
Создание подключений и передача через middleware или зависимости.
Тестирование API Falcon
pip install pytest requests
Пример теста:
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:
class AsyncResource:
async def on_get(self, req, resp):
await asyncio.sleep(1)
resp.media = {'async': True}
Развёртывание Falcon с Gunicorn и Uvicorn
Для WSGI:
gunicorn app:app
Для ASGI:
uvicorn app:app
Продакшн-режим:
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 при создании. |
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) |
Глобальный обработчик исключений. |
@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) |
Вызывается после обработки. |
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) |
Выполняется после метода ресурса. |
@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) |
|