Загружать значение маршрута динамически в Sanic при запуске

Я хочу сделать асинхронный HTTP-вызов внешней службе при запуске сервера и получить оттуда URL-адрес, который затем я могу использовать в своей собственной маршрутизации Sanic. Например, получить строку, которая должна быть моим фактическим маршрутом, с помощью вызова httpx (для простоты предположим, что строка, возвращаемая внешней службой, равна api/users/), а затем использовать ее в качестве маршрута в моем микросервисе Sanic.

К сожалению, кажется, что прослушиватель before_server_start не помогает, так как он запускается после загрузки маршрутов, и я получаю FinalizationError("Cannot finalize router more than once."), если пытаюсь обновить строковое значение маршрута.

Любые идеи о том, как еще я мог бы подключить свой вызов перед определением/добавлением маршрутов? Я хотел бы сохранить его как можно более связанным с приложением Sanic, т. Е. Не использовать служебный скрипт, который будет запускаться перед ним, а вместо этого запускать вызов внешней службы каждый раз при запуске приложения.


person Chris    schedule 21.06.2021    source источник


Ответы (1)


Вы можете сделать это внутри события before_server_start с небольшим обходным путем.

@app.before_server_start
async def setup_dynamic_routes(app, _):
    app.router.reset()

    # add your routes here

    app.router.finalize()
person The Brewmaster    schedule 22.06.2021