【问题标题】:how to set fast API version to allow HTTP can specify version in accept header?如何设置快速 API 版本以允许 HTTP 可以在接受标头中指定版本?
【发布时间】:2021-05-29 02:40:04
【问题描述】:

我正在处理一个需要我对快速 API 端点进行版本控制的项目。我们希望通过 HTTP 接受标头对端点进行版本控制,例如headers={'Accept': 'application/json;version=1.0.1'}, headers={'Accept': 'application/json;version=1.0.2'}。只设置这样的api版本似乎行不通:

app = FastAPI(
        version=version,
        title="A title",
        description="Some description.",
    )

有人知道我还需要做什么吗?

【问题讨论】:

  • 我认为version 参数仅适用于文档。或许可以尝试使用Response headers 来获取您的回复。

标签: http fastapi api-versioning


【解决方案1】:

也许路径 url 中的版本会更好

sub apps docs

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)

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

localhost: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"

【讨论】:

  • 另一种方法是添加一个中间件来识别标头中的版本,然后将请求重定向到您想要的服务
【解决方案2】:

为 fastapi Web 应用程序尝试 api 版本控制

安装

pip install fastapi-versioning

示例

from fastapi import FastAPI
from fastapi_versioning import VersionedFastAPI, version

app = FastAPI(title="My App")


@app.get("/greet")
@version(1, 0)
def greet_with_hello():
    return "Hello"


@app.get("/greet")
@version(1, 1)
def greet_with_hi():
    return "Hi"


app = VersionedFastAPI(app)

这将生成两个端点:

/v1_0/greet
/v1_1/greet

还有:

/docs
/v1_0/docs
/v1_1/docs
/v1_0/openapi.json
/v1_1/openapi.json

还有可能添加一组额外的端点 重定向最新的 API 版本。为此,请提出论点 enable_latest真:

app = VersionedFastAPI(app, enable_latest=True)

这将生成以下附加端点:

/latest/greet
/latest/docs
/latest/openapi.json

在此示例中,/latest 端点将反映与 /v1.1 相同的数据。

试试看:

pip install pipenv
pipenv install --dev
pipenv run uvicorn example.annotation.app:app
# pipenv run uvicorn example.folder_name.app:app

使用无次要版本

from fastapi import FastAPI
from fastapi_versioning import VersionedFastAPI, version

app = FastAPI(title='My App')

@app.get('/greet')
@version(1)
def greet():
  return 'Hello'

@app.get('/greet')
@version(2)
def greet():
  return 'Hi'

app = VersionedFastAPI(app,
    version_format='{major}',
    prefix_format='/v{major}')

这将生成两个端点:

/v1/greet
/v2/greet

还有:

/docs
/v1/docs
/v2/docs
/v1/openapi.json
/v2/openapi.json

额外的 FastAPI 构造函数参数

请务必注意,只有原始 FastAPI 中的 title 提供给 VersionedAPI 应用程序。如果您有任何中间件,事件处理程序 等这些参数也需要提供给 VersionedAPI 函数 调用,如下例所示

from fastapi import FastAPI, Request
from fastapi_versioning import VersionedFastAPI, version
from starlette.middleware import Middleware
from starlette.middleware.sessions import SessionMiddleware

app = FastAPI(
    title='My App',
    description='Greet uses with a nice message',
    middleware=[
        Middleware(SessionMiddleware, secret_key='mysecretkey')
    ]
)

@app.get('/greet')
@version(1)
def greet(request: Request):
    request.session['last_version_used'] = 1
    return 'Hello'

@app.get('/greet')
@version(2)
def greet(request: Request):
    request.session['last_version_used'] = 2
    return 'Hi'

@app.get('/version')
def last_version(request: Request):
    return f'Your last greeting was sent from version {request.session["last_version_used"]}'

app = VersionedFastAPI(app,
    version_format='{major}',
    prefix_format='/v{major}',
    description='Greet users with a nice message',
    middleware=[
        Middleware(SessionMiddleware, secret_key='mysecretkey')
    ]
)

【讨论】:

    猜你喜欢
    • 2019-06-05
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多