Custom Request and Route Classes
Custom Route Class
Section titled “Custom Route Class”Override the default APIRoute to add custom behavior:
from starlette.routing import APIRoutefrom justapi import JustAPIApp, Request
class TimingRoute(APIRoute): def get_route_handler(self): original_handler = super().get_route_handler()
async def custom_handler(request: Request): import time start = time.time() response = await original_handler(request) duration = time.time() - start response.headers["X-Process-Time"] = str(round(duration, 4)) return response
return custom_handler
app = JustAPIApp(route_class=TimingRoute)
@app.get("/items/")def list_items(): return {"items": []}Custom Request Class
Section titled “Custom Request Class”from starlette.requests import Request
class CustomRequest(Request): async def json(self): body = await super().json() # Transform the body before validation return body
@app.post("/items")async def create_item(request: CustomRequest): data = await request.json() return dataSee Also
Section titled “See Also”- Using the Request Directly — raw request access
- Advanced Middleware — custom middleware
- Advanced Dependencies — custom deps