pythonasyncioapiasyncfastapiframeworkjsonjson-schemaopenapiopenapi3pydanticpython-typespython3redocreststarletteswaggerswagger-uiuvicornweb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.3 KiB
61 lines
1.3 KiB
from fastapi import APIRouter, FastAPI, Request
|
|
from starlette.middleware import Middleware
|
|
from starlette.middleware.base import BaseHTTPMiddleware
|
|
|
|
app = FastAPI()
|
|
|
|
|
|
@app.middleware("http")
|
|
async def app_middleware(request: Request, call_next):
|
|
print("App before")
|
|
response = await call_next(request)
|
|
print("App after")
|
|
return response
|
|
|
|
|
|
async def outer_middleware(request: Request, call_next):
|
|
print("Outer before")
|
|
response = await call_next(request)
|
|
print("Outer after")
|
|
return response
|
|
|
|
|
|
outer = APIRouter(
|
|
prefix="/outer",
|
|
middleware=[Middleware(BaseHTTPMiddleware, dispatch=outer_middleware)],
|
|
)
|
|
|
|
|
|
async def name_middleware(request: Request, call_next):
|
|
print(f"Hi {request.path_params.get('name')}!")
|
|
response = await call_next(request)
|
|
print(f"Bye {request.path_params.get('name')}!")
|
|
return response
|
|
|
|
|
|
inner = APIRouter(prefix="/inner")
|
|
|
|
|
|
@inner.get(
|
|
"/{name}",
|
|
middleware=[Middleware(BaseHTTPMiddleware, dispatch=name_middleware)],
|
|
)
|
|
async def hello(name: str):
|
|
print("Handler")
|
|
return {"message": f"Hello {name} from inner!"}
|
|
|
|
|
|
@outer.get("/")
|
|
async def outer_hello():
|
|
print("Handler")
|
|
return {"message": "Hello from outer!"}
|
|
|
|
|
|
@app.get("/")
|
|
async def app_hello():
|
|
print("Handler")
|
|
return {"message": "Hello from app!"}
|
|
|
|
|
|
outer.include_router(inner)
|
|
app.include_router(outer)
|
|
|