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