FastAPI — это фреймворк для создания веб-приложений на языке Python, который использует современные подходы и возможности языка для обеспечения высокой производительности и удобства разработки. Одной из ключевых функций FastAPI является обработка запросов и маршрутизация.
Маршрутизация — это процесс определения того, какой код будет выполняться при обработке запроса, основываясь на пути запроса (URL-адресе), методе запроса и других параметрах. В FastAPI маршрутизация осуществляется через декораторы функций, которые связывают URL-адреса с функциями обработки запросов.
Обработка параметров маршрута в FastAPI
FastAPI позволяет передавать параметры в URL-адресах, что позволяет создавать более гибкие и динамические веб-приложения. Для обработки параметров маршрута в FastAPI используется декоратор @app.get() и аргументы функции обработчика.
Пример:
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(), которая принимает параметр item_id типа int. Параметр передается в URL-адресе после символа / в фигурных скобках {}.
Обработка параметров запроса в FastAPI
FastAPI позволяет передавать параметры в запросах через строку запроса или тело запроса. Для обработки параметров запроса в FastAPI используются аргументы функции обработчика, которые связываются с параметрами запроса по имени.
Пример:
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/")
async def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
В этом примере мы определяем функцию обработчика read_item(), которая принимает два параметра: item_id типа int и q типа str со значением по умолчанию None. Параметры передаются в URL-адресе и через строку запроса соответственно.
Работа с параметрами запроса типа enum
В FastAPI можно использовать параметры запроса типа enum, чтобы ограничить возможные значения параметра. Для этого необходимо определить перечисление enum с допустимыми значениями и связать его с аргументом функции обработчика.
Пример:
from enum import Enum
from fastapi import FastAPI
class ItemType(str, Enum):
foo = "foo"
bar = "bar"
baz = "baz"
app = FastAPI()
@app.get("/items/")
async def read_item(item_type: ItemType):
return {"item_type": item_type}
В этом примере мы определяем перечисление ItemType с тремя возможными значениями: «foo», «bar» и «baz». Затем мы определяем функцию обработчика read_item(), которая принимает параметр item_type типа ItemType.
Теперь, когда мы отправляем запрос с параметром item_type, FastAPI автоматически проверяет, что переданное значение соответствует одному из значений перечисления ItemType. Если переданное значение не является допустимым, FastAPI автоматически вернет ошибку 422 Unprocessable Entity.
Обработка параметров тела запроса в FastAPI
В FastAPI можно передавать параметры в теле запроса в форматах JSON, form-data и других. Для обработки параметров тела запроса в FastAPI используется аргумент request: Request и модуль pydantic для создания схем данных.
Пример:
from fastapi import FastAPI, Request
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item, request: Request):
return {"item": item, "client_host": request.client.host}
В этом примере мы определяем класс Item, который наследуется от BaseModel, и определяет поля для параметров запроса. Затем мы определяем функцию обработчика create_item(), которая принимает параметр item типа Item и аргумент request типа Request для получения информации о запросе.
Теперь, когда мы отправляем запрос с параметрами в теле запроса в формате JSON, FastAPI автоматически проверяет, что параметры соответствуют определенной схеме данных в классе Item. Если параметры не соответствуют схеме данных, FastAPI автоматически вернет ошибку 422 Unprocessable Entity.
Обработка заголовков запроса в FastAPI
В FastAPI можно передавать заголовки запроса для передачи дополнительной информации, такой как авторизационные данные, информация о языке и т.д. Для обработки заголовков запроса в FastAPI используется аргумент request: Request.
Пример:
from fastapi import FastAPI, Request
app = FastAPI()
@app.get("/items/")
async def read_item(request: Request):
client_host = request.client.host
user_agent = request.headers["user-agent"]
return {"client_host": client_host, "user_agent": user_agent}
В этом примере мы определяем функцию обработчика read_item(), которая принимает аргумент request типа Request. Внутри функции мы используем аргумент request для получения информации о клиенте и заголовках запроса. В этом примере мы получаем IP-адрес клиента и заголовок User-Agent.
FastAPI автоматически обрабатывает заголовки запроса и предоставляет доступ к ним через аргумент request. Если запрос не содержит нужных заголовков, FastAPI автоматически вернет ошибку 422 Unprocessable Entity.
Перехват ошибок и логирование в FastAPI
FastAPI предоставляет удобный способ перехвата ошибок и логирования действий в приложении. Для этого используются декораторы exception_handler и middleware.
Пример:
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
# Обработка ошибок HTTPException
@app.exception_handler(HTTPException)
async def http_exception_handler(request, exc):
return JSONResponse(content={"error": exc.detail}, status_code=exc.status_code)
# Middleware для логирования запросов
@app.middleware("http")
async def log_requests(request: Request, call_next):
logger.info(f"{request.method} {request.url}")
response = await call_next(request)
return response
# Middleware для CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/items/{item_id}")
async def read_item(item_id: int):
if item_id == 0:
raise HTTPException(status_code=404, detail="Item not found")
return {"item_id": item_id}
В этом примере мы определяем функцию обработчика http_exception_handler(), которая обрабатывает ошибки HTTPException и возвращает JSON-ответ с информацией об ошибке. Затем мы определяем middleware log_requests(), который логирует каждый запрос, и middleware для обработки CORS. Декоратор app.middleware() используется для добавления middleware в приложение.
FastAPI автоматически вызывает обработчики ошибок и middleware при возникновении ошибок и выполнении запросов. Логирование действий в приложении помогает отслеживать ошибки и улучшать производительность приложения.