如何从 FastAPI 全局依赖项获取返回值

A_z*_*_zc 7 fastapi

快速API 0.68.0

Python 3.8

from fastapi import Depends, FastAPI, Header, HTTPException


async def verify_key(x_key: str = Header(...)):
    if x_key != "fake-super-secret-key":
        raise HTTPException(status_code=400, detail="X-Key header invalid")
    return x_key



app = FastAPI(dependencies=[Depends(verify_key)])



@app.get("/items/")
async def read_items():

    return [{"item": "Portal Gun"}, {"item": "Plumbus"}]


Run Code Online (Sandbox Code Playgroud)

这是来自FastAPI文档的示例(省略部分代码)

有什么办法可以进去x_keyread_items()

Val*_*l K 8

from fastapi import Request, Depends

async def verify_key(request: Request, x_key: str = Header(...)):
    if x_key != "fake-super-secret-key":
        raise HTTPException(status_code=400, detail="X-Key header invalid")

    # save x_key
    request.state.x_key = x_key
    return x_key


app = FastAPI(dependencies=[Depends(verify_key)])


@app.get("/items/")
async def read_items(request: Request):
    # get 'x_key' from request.state
    x_key = request.state.x_key
    return [{"item": "Portal Gun"}, {"item": "Plumbus"}]

Run Code Online (Sandbox Code Playgroud)

烧瓶/瓶子模拟

# current_request.py
import contextvars
from fastapi import Request

_CURRENT_REQUEST = contextvars.ContextVar("_CURRENT_REQUEST", default=None)

class CurrentRequest:

    def __getattr__(self, a):
        current_request = _CURRENT_REQUEST.get()
        if current_request is None:
            raise RuntimeError('Out of context')
        return getattr(current_request, a)

request: Request = CurrentRequest()

async def set_current_request(request: Request):
    _CURRENT_REQUEST.set(request)


# fastapi app/subroute 
from fastapi import Request, Depends

from .current_request import request, set_current_request


async def verify_key(x_key: str = Header(...)):
    if x_key != "fake-super-secret-key":
        raise HTTPException(status_code=400, detail="X-Key header invalid")

    # save x_key
    request.state.x_key = x_key
    return x_key


# ! set_current_request should go first
app = FastAPI(dependencies=[Depends(set_current_request), Depends(verify_key)])


@app.get("/items/")
async def read_items():
    # get 'x_key' from request.state
    x_key = request.state.x_key
    return [{"item": "Portal Gun"}, {"item": "Plumbus"}]

Run Code Online (Sandbox Code Playgroud)


abd*_*sco 2

您可以将verify_key函数read_items作为依赖项注入以读取其值:

from fastapi import Depends

async def verify_key(x_key: str = Header(...)):
    ...

@app.get("/items/")
async def read_items(key: str = Depends(verify_key)):
    // use key
Run Code Online (Sandbox Code Playgroud)

  • 这种方式可以完成。但是如果我有很多接口方法需要依赖verify_key,也许全局依赖是最好的...... (3认同)