Cum să folosești middleware într-un API Python — Logging, CORS și Compresie
In this tutorial, you'll learn about Cum să folosești middleware într. We cover key concepts, practical examples, and best practices to help you understand and apply this topic effectively.
Middleware-ul este un strat software care procesează fiecare request înainte de a ajunge la handler și fiecare response înainte de a fi trimis clientului. În acest ghid vei învăța cum să folosești middleware pentru logging, CORS și compresie.
Problema
Fără middleware, sarcinile transversale precum logging, autentificare și securitate trebuie replicate în fiecare handler. Codul devine duplicat, greu de întreținut și predispus la erori.
Soluția Rapidă
1. Middleware în FastAPI
import time
import logging
from fastapi import FastAPI, Request
logger = logging.getLogger(__name__)
app = FastAPI()
@app.middleware("http")
async def log_request(request: Request, call_next):
start = time.time()
response = await call_next(request)
duration = time.time() - start
logger.info(
f"{request.method} {request.url.path} "
f"-> {response.status_code} ({duration:.3f}s)"
)
return response
2. CORS middleware
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["https://example.com"],
allow_credentials=True,
allow_methods=["GET", "POST", "PUT", "DELETE"],
allow_headers=["Authorization", "Content-Type"],
)
Flask:
pip install flask-cors
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
CORS(app, origins=["https://example.com"])
3. Middleware de compresie
from fastapi.middleware.gzip import GZipMiddleware
app.add_middleware(GZipMiddleware, minimum_size=1000)
Flask:
pip install flask-compress
from flask_compress import Compress
app = Flask(__name__)
compress = Compress()
compress.init_app(app)
4. Middleware securitate (headers)
from starlette.middleware.base import BaseHTTPMiddleware
class SecurityHeadersMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request, call_next):
response = await call_next(request)
response.headers["X-Content-Type-Options"] = "nosniff"
response.headers["X-Frame-Options"] = "DENY"
response.headers["X-XSS-Protection"] = "1; mode=block"
response.headers["Strict-Transport-Security"] = \
"max-age=31536000; includeSubDomains"
return response
app.add_middleware(SecurityHeadersMiddleware)
5. Middleware de request validation în Flask
from functools import wraps
def validare_api_key(f):
@wraps(f)
def decorata(*args, **kwargs):
api_key = request.headers.get("X-API-Key")
if api_key != "cheia-secreta":
return jsonify({"eroare": "Neautorizat"}), 401
return f(*args, **kwargs)
return decorata
@app.route("/api/securizat")
@validare_api_key
def securizat():
return jsonify({"mesaj": "Acces permis"})
Testare:
curl -i http://localhost:8000/ # verifică headerele de securitate
Prevenție
- Plasează middleware-ul de securitate primul în lanț
- Nu loga date sensibile (parole, token-uri) în middleware-ul de logging
- Configurează CORS restrictiv -- nu folosi
*în producție - Folosește compresia doar pentru response-uri mai mari de 1KB
Greșeli Comune
- CORS cu
allow_origins=["*"]în producție -- permite oricărui site să acceseze API-ul - Logarea parolelor și token-urilor -- risc major de securitate
- Middleware prea greoi -- operațiile sincrone în middleware blochează întregul server
- Compresia fișierelor mici -- compresia adaugă overhead pentru fișiere sub 1KB
- Ignorarea ordinii middleware-urilor -- unele middleware-uri depind de altele
Exercițiu Practic
Creează un API cu trei middleware-uri: unul care măsoară timpul de răspuns, unul care adaugă header-e de securitate și unul care blochează request-urile fără un User-Agent valid.
FAQ
Built by the developers of DodaTech
Doda Browser, DodaZIP & Durga Antivirus Pro