Итак, я попытался выяснить, почему именно она не работает. В менеджере продолжительности жизни я распечатал каждый маршрут и связанный с ним url_path_for следующим образом:
Код: Выделить всё
@asynccontextmanager
async def lifespan(app):
for route in app.router.routes:
print(route)
if isinstance(route, Mount):
if isinstance(route.app, Router):
for mount_route in route.app.routes:
print(mount_route)
print(mount_route.url_path_for(mount_route.name))
else:
print(route.url_path_for(route.name))
Код: Выделить всё
Route(path='/', name='index', methods=['GET', 'HEAD'])
/
Route(path='/login', name='login', methods=['GET', 'HEAD'])
/login
Route(path='/logout', name='logout', methods=['GET', 'HEAD'])
/logout
Route(path='/token', name='get_token', methods=['POST'])
/token
Mount(path='/admin', name='', app=)
Mount(path='/user', name='', app=)
Mount(path='/static', name='static', app=)
Затем я вызвал url_path_ еще раз, за исключением непосредственно объекта маршрутизатора приложения:
Код: Выделить всё
print(app.router.url_path_for('token'))
Код: Выделить всё
ERROR: Traceback (most recent call last):
File ".venv\Lib\site-packages\starlette\routing.py", line 693, in lifespan
async with self.lifespan_context(app) as maybe_state:
~~~~~~~~~~~~~~~~~~~~~^^^^^
File "Python\Python313\Lib\contextlib.py", line 214, in __aenter__
return await anext(self.gen)
^^^^^^^^^^^^^^^^^^^^^
File "\main\webapp\main.py", line 30, in lifespan
print(app.router.url_path_for('token'))
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
File ".venv\Lib\site-packages\starlette\routing.py", line 662, in url_path_for
raise NoMatchFound(name, path_params)
starlette.routing.NoMatchFound: No route exists for name "token" and params "".
Насколько я могу судить, мне следует получите соответствующий путь. Есть ли что-то, что я делаю здесь неправильно? Или это проблема Starlete?
Подробнее здесь: https://stackoverflow.com/questions/793 ... rlette-app