Skip to content

Cum să folosești middleware într-un API Python — Logging, CORS și Compresie

DodaTech Updated 2025-01-15 2 min read

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

  1. CORS cu allow_origins=["*"] în producție -- permite oricărui site să acceseze API-ul
  2. Logarea parolelor și token-urilor -- risc major de securitate
  3. Middleware prea greoi -- operațiile sincrone în middleware blochează întregul server
  4. Compresia fișierelor mici -- compresia adaugă overhead pentru fișiere sub 1KB
  5. 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

### Ce este middleware-ul?

Middleware-ul este un strat software care interceptează request-urile și response-urile între client și handler. Este folosit pentru sarcini precum logging, autentificare, CORS și compresie.

Care este diferența între middleware și decorator?

Middleware se aplică global la nivel de aplicație. Decoratorii se aplică la nivel de funcție individuală. Middleware este mai potrivit pentru sarcini transversale.

În ce ordine se execută middleware-urile?

În ordinea în care au fost adăugate. Request-ul trece prin ele în ordine, iar response-ul în ordine inversă. Primul adăugat este primul care procesează request-ul și ultimul care procesează response-ul.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro