Вы можете добавить в свое FastAPI приложение, пользовательское промежуточное ПО (Middleware), что позволит выполнять какие-либо действия до и после выполнения функции маршрута. Во Flask для этого используют функции before_request, after_request.
Пример Middleware в FastAPI:
from fastapi import FastAPI, Request
app = FastAPI()
@app.middleware("http")
async def my_middleware(request: Request, call_next):
print('before')
response = await call_next(request)
print('after')
return response
@app.get("/")
def index():
print('index is running!')
return {"hello": "world"}
Добавив эту функцию и сделав запрос к главной странице сайта /
, вы получите в терминале следующий вывод:
before
index is running!
after
INFO: 127.0.0.1:59169 - "GET / HTTP/1.1" 200 OK
Немного изменим функцию my_middleware
, и добавим проверку User-Agent
.
@app.middleware("http")
async def my_middleware(request: Request, call_next):
if request.headers['User-Agent'].find('curl') == -1:
response = await call_next(request)
return response
return JSONResponse(content={"message": "error"},
status_code=404)
Если сделать запрос с помощью curl
, то она будет обработана как функция представления, и любая дальнейшая обработка запросов будет остановлена.
curl localhost:8000
{"message":"error"}
Так же вы можете сделать Middleware на основе класса.
class MyClassMiddleware:
async def __call__(self, request: Request, call_next):
print('Class before')
response = await call_next(request)
print('Class after')
return response
my_class_middleware = MyClassMiddleware()
app.middleware("http")(my_class_middleware)