Как мне организовать операции с моими путями в FastAPI?

Я создаю приложение с FastAPI, и пока оно выглядит так:

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

Почему это происходит? Есть ли понятие, которое мне не ясно?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Порядок конечных точек имеет значение! Конечные точки сопоставляются в порядке их объявления в вашем объекте FastAPI. Допустим, у вас есть только две конечные точки в следующем порядке:

  1. API/элементы/{user_id}
  2. API/элементы/фильтр

В этом порядке, когда вы запрашиваете конечную точку 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}? Спасибо!

Diegol 29.12.2022 04:37

У вас есть два варианта: вы можете использовать разные типы, если можете, например: {user_id:int} и {name:str} и убедитесь, что user_id находится перед конечной точкой имени (по порядку), потому что «123» может быть оценивается как строка, а «onetwothree» не как целое число. Это работает только в том случае, если ваш user_id является целым числом, если оба являются строками, тогда вы действительно должны изменить одну из конечных точек, чтобы она была более уникальной.

JarroVGIT 29.12.2022 11:01

Большое спасибо! Я выбрал решение с использованием разных типов, и оно сработало для меня!

Diegol 29.12.2022 23:26

Другие вопросы по теме