MiddlewareとSession¶
Hooks¶
@app.before_request
def start_request():
pass
@app.after_request
def add_header(response):
response.headers["X-App"] = "higuma"
return response
起動・終了時の処理にはlifecycle hookを使います。
@app.before_serving
async def connect():
await database.connect()
@app.after_serving
async def disconnect():
await database.disconnect()
Middleware¶
middlewareはrequestと次の処理を受け取ります。
async def timing_middleware(request, call_next):
response = await call_next(request)
response.headers["Server-Timing"] = "app;dur=1"
return response
app.add_middleware(timing_middleware)
CORS¶
from higuma import CORSMiddleware
app.add_middleware(
CORSMiddleware(
allow_origins=["https://example.com"],
allow_methods=["GET", "POST"],
allow_headers=["Content-Type", "Authorization"],
allow_credentials=True,
)
)
セキュリティheaderとhost検証¶
from higuma import SecurityHeadersMiddleware, TrustedHostMiddleware
app.add_middleware(SecurityHeadersMiddleware())
app.add_middleware(
TrustedHostMiddleware(["example.com", "*.example.com"])
)
署名付きSession¶
from higuma import SessionMiddleware
app.add_middleware(
SessionMiddleware(
secret_key="replace-with-a-long-random-secret",
cookie_name="session",
secure=True,
httponly=True,
samesite="Lax",
)
)
from higuma import request
@app.get("/login")
def login():
request.session["user_id"] = 42
return {"logged_in": True}
Secret key
source codeへ固定値を書かず、productionでは環境変数やsecret managerから読み込んでください。 Cookieは署名されますが暗号化はされないため、機密データ自体を保存しないでください。