Я создаю приложение с FastAPI, и пока оно выглядит так:
Но у меня проблема с конечными точками. Маршрут /api/items/filter имеет два параметра запроса: имя и категорию. Однако у меня создается впечатление, что это воспринимается как api/items/{user_id}/filter, поскольку, когда я выполняю проверку в документации, мне выдается ошибка о том, что я не передал значение для user_id . (Кроме того, ранее он просил меня пройти аутентификацию (единственный маршрут, который требовал аутентификации, был api/items/{user_id}. Проблемы устраняются, когда я сначала определяю эту конечную точку, как показано ниже:
Почему это происходит? Есть ли понятие, которое мне не ясно?
Соответствующий ответ также можно найти здесь . Кстати, если вы хотите настроить порядок методов API в пользовательском интерфейсе Swagger, ознакомьтесь с этим ответом.






Порядок конечных точек имеет значение! Конечные точки сопоставляются в порядке их объявления в вашем объекте FastAPI. Допустим, у вас есть только две конечные точки в следующем порядке:
В этом порядке, когда вы запрашиваете конечную точку api/items/user_a, ваш запрос будет перенаправлен на (1) api/items/{user_id}. Однако, если вы запросите api/items/filter, это также будет перенаправлено на (1) api/items/{user_id}! Это связано с тем, что filter соответствует {user_id}, и поскольку эта конечная точка оценивается до того, как вторая конечная точка оценивается на соответствие, вторая конечная точка вообще не оценивается.
Именно поэтому вас просят авторизоваться; вы думаете, что запрашиваете конечную точку 2, но на самом деле ваш запрос направляется в конечную точку 1 с параметром пути {user_id} = "filter".
Таким образом, порядок ваших конечных точек важен, и именно в вашем приложении вы их определяете. Смотрите здесь в документах.
Большое спасибо за ваш ответ! Не могли бы вы помочь мне с чем-то еще? В настоящее время у меня есть конечные точки, как на втором изображении: api/items/filter -- api/items/{user_id} -- api/items/{name} --. Как вы понимаете, теперь у меня проблема с API/items/{user_id} и API/items/{name}, так как при доступе к API/items/{name} на самом деле оценивается api/items/{user_id}. Обе конечные точки имеют параметры пути, поэтому нет смысла их упорядочивать. Что мне делать в таких случаях? я должен изменить последнюю конечную точку на что-то вроде api/items/byname/{name}? Спасибо!
У вас есть два варианта: вы можете использовать разные типы, если можете, например: {user_id:int} и {name:str} и убедитесь, что user_id находится перед конечной точкой имени (по порядку), потому что «123» может быть оценивается как строка, а «onetwothree» не как целое число. Это работает только в том случае, если ваш user_id является целым числом, если оба являются строками, тогда вы действительно должны изменить одну из конечных точек, чтобы она была более уникальной.
Большое спасибо! Я выбрал решение с использованием разных типов, и оно сработало для меня!
Отвечает ли это на ваш вопрос? Как определить несколько конечных точек API в FastAPI с разными путями, но одним и тем же параметром пути?