How to get return values form FastAPI global dependencies

Viewed 1252

FastAPI 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"}]


This is a example from FastAPI doucuments (Omit part of the code)

Is there any way to get x_key in read_items()

2 Answers
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"}]

flask/bottle mimic

# 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"}]

You can inject verify_key function into read_items as dependency to read its value:

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
Related