Files
drhider/site/app.py
T

91 lines
3.0 KiB
Python

"""
DrHider — Managed Flask приложение на платформе Штурвал.
Приложение создаётся фабрикой create_app().
Штурвал запускает Flask самостоятельно (без Dockerfile/gunicorn).
Роуты разнесены по blueprint'ам:
- main_bp: GET / — веб-интерфейс
- health_bp: GET /health — проверка живости
- api_bp: POST /api/drhider — обфускация документов
"""
import os
import sys
import logging
from flask import Flask
# Добавляем корень проекта в sys.path для импорта пакета drhider
_sys_path_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if _sys_path_root not in sys.path:
sys.path.insert(0, _sys_path_root)
# Версия приложения (меняется при изменениях)
VERSION = "0.0.51"
def setup_logging():
"""Настроить логирование. Уровень берётся из env LOG_LEVEL (DEBUG/INFO/WARNING)."""
level_name = os.environ.get("LOG_LEVEL", "INFO").upper()
level = getattr(logging, level_name, logging.INFO)
logging.basicConfig(
level=level,
format="%(asctime)s %(levelname)s [%(name)s] %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
stream=sys.stderr,
force=True,
)
logging.getLogger("drhider").setLevel(level)
logging.getLogger("app").setLevel(level)
logging.getLogger("routes").setLevel(level)
logging.getLogger("session").setLevel(level)
logging.getLogger(__name__).setLevel(level)
log = logging.getLogger("app")
log.info("Logging configured, level=%s, version=%s", level_name, VERSION)
def create_app():
"""Создать и настроить Flask-приложение.
Штурвал запускает из директории site/:
from app import app
Поэтому routes/ доступен как обычный подпакет.
Returns:
Экземпляр Flask с зарегистрированными blueprint'ами.
"""
setup_logging()
app = Flask(__name__)
# Конфигурация
app.config["VERSION"] = VERSION
app.config["MAX_CONTENT_LENGTH"] = 200 * 1024 * 1024 # 200 MB
# Регистрируем blueprint'ы
from routes import register_routes
register_routes(app)
# Запрещаем кэширование — F5 всегда грузит свежую страницу
@app.after_request
def no_cache(response):
response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
response.headers["Pragma"] = "no-cache"
response.headers["Expires"] = "0"
return response
return app
# Экземпляр приложения — точка входа для Штурвала
app = create_app()
# Штурвал запускает: cd site && python app.py
if __name__ == "__main__":
from waitress import serve
serve(app, host="0.0.0.0", port=5000, threads=8)