Middleware (Промежуточное ПО) — это слой обработки запросов и ответов в веб-приложениях, который находится между сервером и вашим основным приложением. Это мощный механизм для перехвата и обработки HTTP-запросов/ответов.
Запрос → Middleware1 → Middleware2 → View → Middleware2 → Middleware1 → Ответ
# Пример кастомного middleware
class SimpleMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# Код, выполняемый ДО view
print(f"До обработки запроса: {request.path}")
response = self.get_response(request)
# Код, выполняемый ПОСЛЕ view
print(f"После обработки запроса. Статус: {response.status_code}")
return response
# Добавление в settings.py
MIDDLEWARE = [
...
'myapp.middleware.SimpleMiddleware',
]
from flask import Flask, request
app = Flask(__name__)
@app.before_request
def before_request_middleware():
print(f"Before request: {request.path}")
@app.after_request
def after_request_middleware(response):
print(f"After request. Status: {response.status}")
return response
from fastapi import FastAPI, Request
app = FastAPI()
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
# До обработки запроса
print(f"Request path: {request.url.path}")
response = await call_next(request)
# После обработки запроса
response.headers["X-Custom-Header"] = "Example"
return response
Request Middleware:
Response Middleware:
Error Middleware:
# Django
import time
import logging
logger = logging.getLogger(__name__)
class AnalyticsMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
start_time = time.time()
# Анализ запроса
request.analytics = {
'user_agent': request.META.get('HTTP_USER_AGENT'),
'ip': request.META.get('REMOTE_ADDR')
}
response = self.get_response(request)
# Логирование
duration = time.time() - start_time
logger.info(
f"Path: {request.path} | "
f"Method: {request.method} | "
f"Duration: {duration:.2f}s"
)
return response
Middleware — это как "слои луковицы" вокруг вашего приложения, где каждый слой может модифицировать запрос или ответ, не затрагивая основную логику приложения.