如何设置 FastAPI 版本以允许 HTTP 在接受标头中指定版本?

Sue*_* Xu 9 http api-versioning fastapi

我正在开发一个需要对 FastAPI 端点进行版本控制的项目。我们希望通过 HTTP 接受标头对端点进行版本控制,例如:

headers={'Accept': 'application/json;version=1.0.1'}, 
headers={'Accept': 'application/json;version=1.0.2'}
Run Code Online (Sandbox Code Playgroud)

像这样设置 api 版本似乎不起作用:

headers={'Accept': 'application/json;version=1.0.1'}, 
headers={'Accept': 'application/json;version=1.0.2'}
Run Code Online (Sandbox Code Playgroud)

有谁知道我还需要做什么?

小智 14

好吧,也许路径 url 中的版本可能会更好

子应用程序文档

from fastapi import FastAPI

app = FastAPI()
v1 = FastAPI()

@v1.get("/app/")
def read_main():
    return {"message": "Hello World from api v1"}

v2 = FastAPI()

@v2.get("/app/")
def read_sub():
    return {"message": "Hello World from  api v2"}

app.mount("/api/v1", v1)
app.mount("/api/v2", v2)
Run Code Online (Sandbox Code Playgroud)

您将看到每个应用程序的自动文档

本地主机:8000/api/v1/docs

本地主机:8000/api/v2/docs

但你总是得到请求中的标头

from starlette.requests import Request

from fastapi import FastAPI
app = FastAPI()

@app.post("/hyper_mega_fast_service")
def fast_service(request: Request, ):

    aceept = request.headers.get('Accept')

    value = great_fuction_to_get_version_from_header(aceept)
    if value == '1.0.1': 
        "Do something"
        
    if value == '1.0.2': 
        "Do something"
Run Code Online (Sandbox Code Playgroud)