Middleware
Основную работу по обеспечению версионирования выполняет middleware VersioningMiddleware
.
Middleware добавляется только в FastAPI-приложение, которое агрегирует в себе субприложения, отвечающие за конкретные версии.
from fastapi import FastAPI, Depends
from fastapi_easy_versioning import VersioningMiddleware, versioning
app = FastAPI()
app_v1 = FastAPI(api_version=1)
app_v2 = FastAPI(api_version=2)
app.mount("/v1", app_v1)
app.mount("/v2", app_v2)
app.add_middleware(VersioningMiddleware)
Если требуется создать два или более изолированных версионированных API, каждый из которых должен работать независимо, следует добавить VersioningMiddleware
в каждое такое агрегирующее приложение.
from fastapi import Depends, FastAPI, middleware
from fastapi_easy_versioning import VersioningMiddleware
app = FastAPI()
public_app = FastAPI(middleware=[middleware.Middleware(VersioningMiddleware)])
public_v1 = FastAPI(api_version=1)
public_v2 = FastAPI(api_version=2)
private_app = FastAPI(middleware=[middleware.Middleware(VersioningMiddleware)])
private_v1 = FastAPI(api_version=1)
private_v2 = FastAPI(api_version=2)
app.mount("/api/public", public_app)
public_app.mount("/v1", public_v1)
public_app.mount("/v2", public_v2)
app.mount("/api/private", private_app)
private_app.mount("/v1", private_v1)
private_app.mount("/v2", private_v2)
Настройка приложений-версий
Middleware определяет, какие FastAPI-приложения участвуют в версионировании, с помощью extra-параметра api_version
. Если приложение не имеет этого параметра, оно будет игнорироваться при версионировании: в него не будут добавляться эндпоинты, и из него не будут браться эндпоинты, даже если они были корректно помечены с помощью зависимости VersioningSupport
.
Работа middleware
Middleware проверяет наличие версионированных эндпоинтов и субприложений при первом запросе и добавляет эндпоинты в субприложения в соответствии с их настройками версионирования, а также перестраивает OpenAPI-схему.
Middleware кэширует информацию о построенных эндпоинтах и при последующих запросах не выполняет дополнительную работу. Однако если версионированный эндпоинт будет добавлен во время выполнения приложения, при следующем запросе он будет добавлен во все соответствующие субприложения, и их OpenAPI-схема будет перестроена.