В FastAPI вы можете определить маршруты с помощью декораторов, таких как @app.get, @app.post, @app.put, @app.delete и т.д. Каждый декоратор определяет тип HTTP-запроса, который обрабатывается маршрутом. Например, декоратор @app.get обрабатывает GET-запросы, а декоратор @app.post обрабатывает POST-запросы.
Работа с параметрами маршрута
FastAPI позволяет определять параметры в маршруте, используя фигурные скобки {}. Значения параметров передаются в функцию обработчика в качестве аргументов. Например:
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
В этом примере мы определяем маршрут «/items/{item_id}», который принимает параметр item_id. Функция обработчика read_item() получает значение параметра item_id в качестве аргумента и возвращает словарь, который содержит значение item_id.
Работа с параметрами запроса
FastAPI также позволяет работать с параметрами запроса, передаваемыми в URL-адресе. Для этого вы можете определить параметры запроса в функции обработчика, используя декораторы, такие как @query_param.
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: str = Query(None, max_length=50)):
return {"q": q}
В этом примере мы определяем маршрут «/items/», который принимает параметр запроса q. Декоратор @Query указывает, что параметр q должен быть передан в запросе, и задает максимальную длину в 50 символов. Если параметр не передан, используется значение по умолчанию None. Функция read_items() возвращает словарь, который содержит значение параметра q.
Работа с параметрами тела запроса
FastAPI позволяет работать с параметрами тела запроса, передаваемыми в формате JSON. Для этого вы можете определить модель данных, используемую в качестве параметра, и использовать ее в функции обработчика.
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
@app.post("/items/")
async def create_item(item: Item):
return item
В этом примере мы создаем модель данных Item, которая содержит поля name, price и is_offer. Функция обработчика create_item() принимает экземпляр модели в качестве параметра item. Это позволяет передавать данные в формате JSON в теле POST-запроса. Возвращаемое значение также является экземпляром модели данных Item.
Использование стандартных кодов ответа HTTP
FastAPI предоставляет простой способ использования стандартных кодов ответа HTTP. Для этого вы можете использовать соответствующие константы из модуля starlette.status.
from fastapi import FastAPI, HTTPException
from starlette import status
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int):
if item_id == 0:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Item not found")
return {"item_id": item_id}
В этом примере мы используем константу status.HTTP_404_NOT_FOUND для указания статуса ответа HTTP. Если значение параметра item_id равно 0, мы вызываем исключение HTTPException с указанным статусом и дополнительным сообщением. В противном случае мы возвращаем словарь, который содержит значение item_id.
Работа с заголовками HTTP
FastAPI позволяет работать с заголовками HTTP, передаваемыми в запросе. Для этого вы можете использовать объект Request, передаваемый в качестве параметра функции обработчика.
from fastapi import FastAPI, Header
from starlette.requests import Request
app = FastAPI()
@app.get("/items/")
async def read_items(request: Request, user_agent: str = Header(None)):
return {"User-Agent": user_agent}
В этом примере мы определяем функцию обработчика read_items(), которая получает объект Request в качестве параметра. Мы также определяем параметр user_agent, который получает значение заголовка User-Agent из запроса. Функция возвращает словарь, который содержит значение user_agent.
Работа с зависимостями
FastAPI предоставляет удобный способ использования зависимостей, таких как базы данных или внешние API. Для этого вы можете определить функцию зависимости с помощью декоратора @app.depends.
from fastapi import FastAPI, Depends
app = FastAPI()
def get_db():
db = DBSession()
try:
yield db
finally:
db.close()
@app.get("/items/")
async def read_items(db: DBSession = Depends(get_db)):
return db.query(Item).all()
В этом примере мы определяем функцию зависимости get_db(), которая возвращает экземпляр соединения с базой данных. Мы также определяем функцию обработчика read_items(), которая получает соединение с базой данных как параметр db, используя декоратор Depends. В этом случае FastAPI автоматически создает экземпляр соединения и передает его в качестве параметра функции read_items(). После выполнения функции FastAPI автоматически закрывает соединение с базой данных.
Работа с асинхронными функциями
FastAPI поддерживает асинхронные функции и корутины в Python. Это позволяет повысить производительность и обрабатывать большое количество запросов одновременно.
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
В этом примере мы определяем функцию обработчика read_item(), которая использует ключевое слово async для определения асинхронной функции. Мы также определяем параметр item_id, который принимает значение типа int. Функция возвращает словарь, который содержит значение item_id.
Работа с тестированием
FastAPI предоставляет простой способ тестирования вашего приложения. Для этого вы можете использовать стандартный модуль unittest или любую другую библиотеку тестирования Python.
from fastapi.testclient import TestClient
from main import app
client = TestClient(app)
def test_read_item():
response = client.get("/items/1")
assert response.status_code == 200
assert response.json() == {"item_id": 1}
этом примере мы определяем функцию test_read_item(), которая использует клиент TestClient для выполнения GET-запроса к ресурсу /items/1. Мы также проверяем, что статус ответа HTTP равен 200 и что возвращаемый JSON-объект содержит правильное значение item_id.
Заключение
FastAPI представляет собой быстрый и эффективный фреймворк для создания веб-приложений на Python. Он предоставляет широкий набор функций для работы с маршрутизацией, параметрами запроса, зависимостями, асинхронными функциями и тестированием. Если вы ищете быстрый и удобный способ создания веб-приложений на Python, то FastAPI – это отличный выбор.