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.
Упражнения
- Создать пять функций, с соответствующими маршрутами и проверить работу маршрутизации при разном порядке объявления функций.