/
zhikovkoly
/
Lab1_api
Обзор
Документация
Войти
/
zhikovkoly
/
Lab1_api
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/middleware.py
78 строк
2 KB
Zhikov-Nikolay
first_commit
19 янв 2026, 18:15
19 янв 2026, 18:15
b7dd5a5
Код
Авторство
О чём код?
from flask import request, jsonify from functools import wraps def require_api_key(f): """Middleware для проверки API ключа""" @wraps(f) def decorated(*args, **kwargs): from .auth import verify_api_key api_key = request.headers.get('X-API-Key') if not api_key: return jsonify({ "error": "API key is required", "message": "Please provide X-API-Key header" }), 401 if not verify_api_key(api_key): return jsonify({ "error": "Invalid API key", "message": "The provided API key is not valid" }), 401 return f(*args, **kwargs) return decorated # Простой rate limiting (для демонстрации) class SimpleRateLimiter: def __init__(self): self.requests = {} def check(self, ip, endpoint, limit=100, window=60): key = f"{ip}:{endpoint}" import time current_time = time.time() if key not in self.requests: self.requests[key] = [] # Удаляем старые запросы self.requests[key] = [t for t in self.requests[key] if current_time - t < window] if len(self.requests[key]) >= limit: return False self.requests[key].append(current_time) return True rate_limiter = SimpleRateLimiter() def rate_limit(limit=100, window=60): """Декоратор для rate limiting""" def decorator(f): @wraps(f) def wrapped(*args, **kwargs): ip = request.remote_addr or '127.0.0.1' endpoint = f.__name__ if not rate_limiter.check(ip, endpoint, limit, window): return jsonify({ "error": "Rate limit exceeded", "message": f"Too many requests. Limit is {limit} per {window} seconds", "retry_after": window }), 429 response = f(*args, **kwargs) return response return wrapped return decorator