FastAPI middleware (before after)

FastAPI middleware (before after)

Автор: Рамис | Статьи 23 января 2023

Вы можете добавить в свое 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)

Комментарии

Markdown
Войти