Шаг 1: Анализ существующего приложения. Составьте полный список зависимостей вашего Flask-приложения: ядро Flask, расширения (Flask-Login, Flask-WTF, Flask-SQLAlchemy, Flask-RESTful и т.д.), версии Python. Проанализируйте архитектуру: количество маршрутов, используемые HTTP-методы, механизмы аутентификации/авторизации, работу с базами данных, шаблонизацию (Jinja2), обработку статических файлов.
Шаг 2: Выбор отечественного фреймворка. Рассмотрим два основных пути:
- **Путь A: FastAPI-подобный синтаксис на основе Uvicorn/Starlette.** Хотя FastAPI не является российским проектом, его можно использовать как основу, полностью заместив импортные компоненты. Более "чистый" вариант — использование `uvicorn` с `starlette` и написание собственного слоя с синтаксисом, аналогичным FastAPI (Pydantic для валидации). Это дает асинхронность и высокую производительность.
- **Путь B: Фреймворк aiohttp.** Это мощный асинхронный фреймворк, который можно стилизовать под Flask. Он предоставляет низкоуровневый контроль и высокую скорость.
- **Путь C: Исследование нишевых российских фреймворков,** таких как SPF или другие, представленные на площадках вроде Russian Open Source. Их выбор должен быть обусловлен зрелостью, документацией и активностью сообщества.
Шаг 3: Замена базовой структуры. В Flask приложение инициализируется как `app = Flask(__name__)`. В aiohttp/ОМФ это будет `app = web.Application()`.
Пример простого маршрута:
Flask:
```
@app.route('/')
def index():
return "Привет, мир!"
```
ОМФ на aiohttp:
```
async def index(request):
return web.Response(text='Привет, мир!')
app.router.add_get('/', index)
```
Шаг 4: Миграция роутинга с параметрами. Flask использует синтаксис ``. В aiohttp используется схожая, но немного отличающаяся система.
Flask:
```
@app.route('/user/')
def show_user(user_id):
return f'User {user_id}'
```
ОМФ:
```
async def show_user(request):
user_id = int(request.match_info['user_id'])
return web.Response(text=f'User {user_id}')
app.router.add_get('/user/{user_id:\d+}', show_user)
```
Для упрощения можно создать декоратор, имитирующий синтаксис Flask.
Шаг 5: Работа с запросами и JSON. Flask использует `request.get_json()`. В асинхронном фреймворке нужно читать тело запроса асинхронно.
Flask:
```
@app.route('/api/data', methods=['POST'])
def receive_data():
data = request.get_json()
return jsonify({'status': 'ok', 'received': data})
```
ОМФ:
```
async def receive_data(request):
data = await request.json()
return web.json_response({'status': 'ok', 'received': data})
app.router.add_post('/api/data', receive_data)
```
Шаг 6: Замена расширений — самый сложный этап.
- **Аутентификация:** Вместо Flask-Login необходимо реализовать собственную middleware для aiohttp, которая будет проверять сессионные токены или JWT, хранящиеся в Redis (отечественный аналог — Tarantool или просто Redis). Пример middleware для проверки JWT.
- **Работа с БД:** Вместо Flask-SQLAlchemy можно использовать чистый SQLAlchemy с асинхронным драйвером `asyncpg` для PostgreSQL или `aiomysql`. Инициализация подключения будет управляться в рамках жизненного цикла приложения (signals `on_startup`/`on_cleanup`).
- **Валидация форм и API:** Вместо Flask-WTF и RESTful используйте библиотеку `pydantic` (если она допустима) или разработайте собственный валидатор на основе `marshmallow`-подобной логики. Для ОМФ можно создать модуль `омф.валидатор`.
- **Шаблонизация:** Jinja2 можно заменить на отечественный аналог, например, `SimpleTemplate` из aiohttp или поискать русскоязычные движки. Либо продолжить использовать Jinja2, но с учетом возможных ограничений.
Шаг 8: Запуск приложения. Flask использует `app.run()`. В aiohttp/ОМФ приложение запускается через ASGI-сервер.
```
if __name__ == '__main__':
web.run_app(app, host='127.0.0.1', port=8080)
```
В продакшене используйте `uvicorn` или `hypercorn` с вашим приложением, обернутым в совместимый ASGI-интерфейс.
Шаг 9: Тестирование. Напишите модульные и интеграционные тесты, используя `pytest` и `pytest-aiohttp`, чтобы убедиться, что функциональность полностью соответствует оригинальному Flask-приложению.
Импортозамещение Flask — это не просто замена импорта, а переосмысление архитектуры с учетом возможностей и ограничений нового фреймворка. Такой подход позволяет не только достичь технологического суверенитета, но и потенциально улучшить производительность за счет асинхронной модели, где это применимо.
Комментарии (9)