Appearance
Path - Путь
Зачем нужна маршрутизация?
Rout - маршрутизация
или Path - путь
- это сердце любого веб-фреймворка, включая FastAPI
. Она отвечает за то, чтобы входящий HTTP-запрос (например, запрос от браузера) был направлен к правильной функции в вашем коде для его обработки.
Представьте себе, что веб-приложение - это большой офис, а HTTP-запрос - это посетитель. Маршрутизация работает как служба ресепшн, которая определяет, в какой кабинет (какую функцию в вашем коде) нужно направить посетителя в зависимости от цели его визита (пути в URL).
Создание новых станиц
Пример кода с одинаково именованными функциями:
python
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def same_page() -> str:
return "The main page of the local FastAPI!"
@app.get("/new_page/")
def same_page() -> str:
return "The new page of the local FastAPI!"
@app.get("/next_page/")
def same_page() -> str:
return "The next page of the local FastAPI!"
В FastAPI
декораторы @app.get("/path/")
используются для определения маршрутов (endpoints) и связывания их с функциями-обработчиками. Каждый декоратор указывает путь, по которому будет доступен соответствующий обработчик. В приведенном примере три разных пути ("/"
, "/new_page/"
и "/next_page/"
) связаны с одной и той же функцией same_page
.
Обычно функции с одинаковыми именами в одном и том же пространстве имен namespace
будут перезаписывать друг друга. Но понимая как работает декоратор, функции останутся уникальными и буду работать и выводить заданную информацию по заданному маршруту:
- Путь
http://localhost:8000/
вызовет функцию, связанная с маршрутом@app.get("/")
. Она вернет "The main page of the local FastAPI!". - Путь
http://localhost:8000/new_page/
вызовет функцию, связанная с маршрутом@app.get("/new_page/")
. Она вернет "The new page of the local FastAPI!". - Путь
http://localhost:8000/next_page/
вызовет функцию, связанная с маршрутом@app.get("/next_page/")
. Она вернет "The next page of the local FastAPI!".
Однако использование одинаковых имен функций может привести к путанице и потенциальным ошибкам и ухудшению читаемости кода. т.к. важное свойство функции гласит: Именование части выполняемого кода!
.
Рекомендации по именованию функций
Для улучшения читаемости и избежания ошибок рекомендуется использовать уникальные и осмысленные имена для каждой функции-обработчика. Вот пример, как можно улучшить именование функций:
python
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def get_main_page() -> str:
return "The main page of the local FastAPI!"
@app.get("/new_page/")
def get_new_page() -> str:
return "The new page of the local FastAPI!"
@app.get("/next_page/")
def get_next_page() -> str:
return "The next page of the local FastAPI!"
Использование уникальных имен функций помогает лучше понять, что делает каждая функция, и облегчает поддержку и расширение кода.
Важность слеша в маршрутизации
FastAPI (и многие другие веб-фреймворки) по умолчанию различает URL-ы со слешем в конце и без него.
@app.get(/page)
: Этот маршрут будет соответствовать запросам, точно соответствующим пути/page
.@app.get(/page/)
: Этот маршрут будет соответствовать запросам, точно соответствующим пути/page/
.
Почему это важно?
Четкость и контроль: Разделение маршрутов позволяет вам явно определять, как обрабатывать запросы с разными URL-ами. Вы можете возвращать разный контент или выполнять разные действия в зависимости от наличия или отсутствия слеша.
SEO (Search Engine Optimization): Поисковые системы могут рассматривать URL-ы со слешем и без слеша как разные страницы. Несогласованность может негативно сказаться на SEO. Как правило, рекомендуется придерживаться одного стиля (либо всегда использовать слеш в конце, либо никогда), чтобы избежать дублирования контента в глазах поисковиков.
Стандарты веба: Исторически, слеш в конце URL-а часто использовался для обозначения каталога (директории) на сервере. Хотя это уже не всегда актуально, многие веб-серверы и фреймворки по-прежнему следуют этому соглашению.
Автоматическое перенаправление (редирект)
FastAPI
имеет параметр redirect_slashes
, который по умолчанию включен (True
). Если этот параметр включен, то FastAPI
будет автоматически перенаправлять запросы без слеша /
в конце на URL
со слешем (и наоборот), если такой маршрут существует.
Например, если вы обратитесь к http://localhost:8000/new_page
и существует маршрут для /new_page/
, FastAPI автоматически перенаправит вас на http://localhost:8000/new_page/
(с кодом состояния 307 Temporary Redirect). Однако, в этом примере у вас оба маршрута определены, поэтому перенаправления не будет.
python
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def get_main_page() -> str:
return "The main page of the local FastAPI!"
@app.get("/with_slash/")
def get_with_slash_page() -> str:
return "Rout with slash `/` in the end!"
@app.get("/no_slash")
def get_no_slash_page() -> str:
return "Rout without slash `/` in the end!"
@app.get("/same_rout")
def get_same_rout_no_slash() -> str:
return "The same rout without slash `/` in the end!"
@app.get("/same_rout/")
def get_same_rout_with_slash() -> str:
return "The same rout with slash `/` in the end!"
Исследуем работу приведенного кода и результаты, которые будут выводиться в браузере по указанным путям. В FastAPI маршруты могут заканчиваться слешем или не заканчиваться слешем, и это может влиять на то, как они обрабатываются.
Маршрут
/
:- URL:
http://localhost:8000
- URL:
http://localhost:8000/
будет перенаправлен по пути без слеша. - Результат:
"The main page of the local FastAPI!"
- URL:
Маршрут
/with_slash/
:- URL:
http://localhost:8000/with_slash
будет перенаправлен по пути со слешем. - URL:
http://localhost:8000/with_slash/
- Результат:
"Rout with slash '/' in the end!"
- URL:
Маршрут
/no_slash
:- URL:
http://localhost:8000/no_slash
- URL:
http://localhost:8000/no_slash/
будет перенаправлен по пути без слеша. - Результат:
"Rout without slash '/' in the end!"
- URL:
Маршрут
/same_rout
:- URL:
http://localhost:8000/same_rout
- Результат:
"The same rout without slash '/' in the end!"
- URL:
Маршрут
/same_rout/
:- URL:
http://localhost:8000/same_rout/
- Результат:
"The same rout with slash '/' in the end!"
- URL:
Слеш /
в конце URL - это важная деталь, которую нужно учитывать при проектировании API. FastAPI
предоставляет гибкость в обработке маршрутов со слешем и без него, но важно понимать, как это работает, чтобы создавать предсказуемое и удобное API. Рекомендуется принять согласованное решение об использовании или неиспользовании слеша в конце URL-ов и придерживаться его во всем вашем API.
Упражнения
- Создать пять функций, с соответствующими маршрутами и проверить работу маршрутизации при разном порядке объявления функций.