/
DnTyr
/
Password-Development
Обзор
Документация
Войти
/
DnTyr
/
Password-Development
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
backend/app/__init__.py
111 строк
3 KB
DT
first_commit
03 июн 2026, 10:22
03 июн 2026, 10:22
357cb35
Код
Авторство
О чём код?
import logging import os from pathlib import Path from dotenv import load_dotenv from flask import Flask, jsonify, request, g from flask_limiter.errors import RateLimitExceeded from flask_cors import CORS from config import Config from app.extensions import limiter from werkzeug.middleware.proxy_fix import ProxyFix def register_error_handlers(app): @app.before_request def attach_request_id(): g.request_id = request.headers.get("X-Request-ID", "-") @app.after_request def add_request_id_header(response): if "X-Request-ID" not in response.headers: response.headers["X-Request-ID"] = g.get("request_id", "-") return response @app.errorhandler(RateLimitExceeded) def handle_rate_limit(e): resp = jsonify({ "error": "rate_limit", "source": "backend", "layer": "app", "type": "limiter", "message": "Слишком много запросов" }) resp.status_code = 429 resp.headers["X-Gateway"] = "backend" resp.headers["X-Limit-Layer"] = "app" resp.headers["X-Limit-Type"] = "limiter" return resp @app.errorhandler(429) def handle_generic_429(e): resp = jsonify({ "error": "rate_limit", "source": "backend", "layer": "app", "type": "lock", "message": "Запрос уже выполняется или превышен лимит" }) resp.status_code = 429 resp.headers["X-Gateway"] = "backend" resp.headers["X-Limit-Layer"] = "app" resp.headers["X-Limit-Type"] = "lock" return resp @app.errorhandler(405) def handle_405(e): resp = jsonify({ "error": "method_not_allowed", "source": "backend", "layer": "app", "message": "Method not allowed" }) resp.status_code = 405 resp.headers["X-Gateway"] = "backend" resp.headers["X-Limit-Layer"] = "app" return resp JSON_SORT_KEYS = False _DEFAULT_CORS_ALLOWED_ORIGINS = [ "http://localhost:3000", "http://127.0.0.1:3000", "http://192.168.0.113:3000", "https://192.168.0.113", "https://localhost:3000", "http://192.168.0.113" ] def _load_cors_origins(): raw = os.getenv("CORS_ALLOWED_ORIGINS") if not raw: return _DEFAULT_CORS_ALLOWED_ORIGINS origins = [o.strip() for o in raw.split(",") if o.strip()] return origins if origins else _DEFAULT_CORS_ALLOWED_ORIGINS def create_app(): load_dotenv(Path(__file__).resolve().parent.parent / ".env") app = Flask(__name__) logging.basicConfig(level=logging.INFO) app.logger.info('=== Password App Backend Startup ===') app.config.from_object("config.Config") app.config['JSONIFY_PRETTYPRINT_REGULAR'] = False app.config['MAX_CONTENT_LENGTH'] = Config.MAX_CONTENT_LENGTH CORS(app, resources={r"/api/*": {"origins": _load_cors_origins()}}) from app.routes.password import password_bp app.register_blueprint(password_bp, url_prefix="/api") limiter.init_app(app) register_error_handlers(app) app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_proto=1, x_host=1, x_port=1) return app