У меня проблемы с RouteTableDef.
Существует некоторый проект, в котором структура маршрутизации выглядит так:
1) Имеется файл route.py
.
routes.py
from aiohttp import web
routes = web.RouteTableDef()
2) В разных файлах есть несколько обработчиков, например: handler1.py
from aiohttp import web
from routes import routes
@routes.get('/get')
async def handle(request):
name = request.match_info.get('name', "Anonymous")
text = "Hello, " + name
return web.Response(text=text)
и так далее.
3) и основной файл, где выполняется приложение:
from aiohttp import web
from routes import routes
if __name__ == '__main__':
app = web.Application()
app.router.add_routes(routes)
web.run_app(app, host='localhost', port=8877)
Идея такова:
все маршруты хранятся в переменной routes
, когда мы хотим создать нового обработчика, мы импортируем эту переменную из routes.py
и используем ее.
Чтобы регистрировать маршруты в приложении, мы импортируем routes
из routes
routes.py
.
И как заставить его работать с aiohttp v3.3.2?
Проблема в том, что она работает с aiohttp version 2.3.10.
Но есть реальный проект с таким способом маршрутизации, и он работает.
Как создать одно место, которое будет хранить маршруты?
Я полагаю, что проблема в версии lib, потому что этот проект не работает с последней версией aiohttp.
Импорт обработчик запроса handle
к файлу, где web.Application
создает и работает. Импортируйте его перед импортом routes
с routes.py
Проблема здесь заключается в порядке импорта, как уже было сказано. Это одна из причин, по которой я создаю по одному web.RouteTableDef()
в каждом файле, а затем web.RouteTableDef()
их вместе для app.router
:
from .dashboard import routes as dashboard_routes
from .posts import routes as posts_routes
app.router.add_routes([
*dashboard_routes,
*posts_routes,
])
Общий ответ работает, но разве не немного избыточно импортировать обработчики, когда они вообще не используются?
Зачем использовать декораторы, когда вам все еще нужно импортировать все обработчики?