Skip to content

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/.

Почему это важно?

  1. Четкость и контроль: Разделение маршрутов позволяет вам явно определять, как обрабатывать запросы с разными URL-ами. Вы можете возвращать разный контент или выполнять разные действия в зависимости от наличия или отсутствия слеша.

  2. SEO (Search Engine Optimization): Поисковые системы могут рассматривать URL-ы со слешем и без слеша как разные страницы. Несогласованность может негативно сказаться на SEO. Как правило, рекомендуется придерживаться одного стиля (либо всегда использовать слеш в конце, либо никогда), чтобы избежать дублирования контента в глазах поисковиков.

  3. Стандарты веба: Исторически, слеш в конце 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 маршруты могут заканчиваться слешем или не заканчиваться слешем, и это может влиять на то, как они обрабатываются.

  1. Маршрут /:

    • URL: http://localhost:8000
    • URL: http://localhost:8000/ будет перенаправлен по пути без слеша.
    • Результат: "The main page of the local FastAPI!"
  2. Маршрут /with_slash/:

    • URL: http://localhost:8000/with_slash будет перенаправлен по пути со слешем.
    • URL: http://localhost:8000/with_slash/
    • Результат: "Rout with slash '/' in the end!"
  3. Маршрут /no_slash:

    • URL: http://localhost:8000/no_slash
    • URL: http://localhost:8000/no_slash/ будет перенаправлен по пути без слеша.
    • Результат: "Rout without slash '/' in the end!"
  4. Маршрут /same_rout:

    • URL: http://localhost:8000/same_rout
    • Результат: "The same rout without slash '/' in the end!"
  5. Маршрут /same_rout/:

    • URL: http://localhost:8000/same_rout/
    • Результат: "The same rout with slash '/' in the end!"

Слеш / в конце URL - это важная деталь, которую нужно учитывать при проектировании API. FastAPI предоставляет гибкость в обработке маршрутов со слешем и без него, но важно понимать, как это работает, чтобы создавать предсказуемое и удобное API. Рекомендуется принять согласованное решение об использовании или неиспользовании слеша в конце URL-ов и придерживаться его во всем вашем API.

Упражнения

  1. Создать пять функций, с соответствующими маршрутами и проверить работу маршрутизации при разном порядке объявления функций.

Contacts: teffal@mail.ru