feat: schema.py (DDL 5 таблиц), db.py без DDL, app.py минимальный, test_routes с комментариями
По рекомендации Sonnet: - schema.py — все DDL (documents, contracts, supplements, spec_rows, spec_history) - db.py — только транспорт (connect/query), DDL убран - app.py — минимальный: ensure_schema() + register_blueprint() - test_routes.py — подробные комментарии, исправлен импорт psysql
This commit is contained in:
+45
-6
@@ -1,33 +1,72 @@
|
||||
"""
|
||||
app.py — Точка входа и сборка слоёв.
|
||||
|
||||
Бизнес-логики НОЛЬ. Только:
|
||||
1. Инициализация схемы БД (schema.ensure_schema)
|
||||
2. Регистрация Blueprint-ов (test, api — будут добавляться)
|
||||
|
||||
Правило: если в app.py появляется if/for или бизнес-слово — это лишнее.
|
||||
"""
|
||||
|
||||
import os
|
||||
from dotenv import load_dotenv
|
||||
from flask import Flask, render_template
|
||||
|
||||
import db
|
||||
import schema
|
||||
from test_routes import test_bp
|
||||
|
||||
load_dotenv()
|
||||
|
||||
|
||||
class ContractsApp:
|
||||
"""
|
||||
Главный класс приложения.
|
||||
Собирает все слои вместе, не содержит логики.
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.app = Flask(__name__)
|
||||
self.add_routes()
|
||||
|
||||
def add_routes(self):
|
||||
self.app.add_url_rule("/", "index", self.index)
|
||||
self.app.add_url_rule("/health", "health", self.health)
|
||||
# 1. Создать таблицы при старте (если их ещё нет)
|
||||
schema.ensure_schema()
|
||||
|
||||
# 2. Собрать маршруты
|
||||
self._add_routes()
|
||||
|
||||
def _add_routes(self):
|
||||
"""Регистрация всех Blueprint-ов и системных маршрутов."""
|
||||
|
||||
# -- Системные маршруты --
|
||||
self.app.add_url_rule("/", "index", self._index)
|
||||
self.app.add_url_rule("/health", "health", self._health)
|
||||
|
||||
# -- Blueprint-ы (каждый слой — отдельный Blueprint) --
|
||||
self.app.register_blueprint(test_bp)
|
||||
# self.app.register_blueprint(api_bp) # ← будет добавлен позже
|
||||
|
||||
def index(self):
|
||||
def _index(self):
|
||||
"""Главная страница — статус сервиса."""
|
||||
conn, _ = db.connect()
|
||||
db_status = "connected" if conn else "no DB"
|
||||
return render_template("index.html", db_status=db_status)
|
||||
|
||||
def health(self):
|
||||
def _health(self):
|
||||
"""Health check для платформы."""
|
||||
return "OK", 200, {"Content-Type": "text/plain"}
|
||||
|
||||
def run(self):
|
||||
"""Запуск Flask (только для разработки, в production — gunicorn)."""
|
||||
self.app.run(host="0.0.0.0", port=5000)
|
||||
|
||||
|
||||
# ── Точка входа ─────────────────────────────────────────────────
|
||||
|
||||
if __name__ == "__main__":
|
||||
app_instance = ContractsApp()
|
||||
app_instance.run()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app_instance = ContractsApp()
|
||||
app_instance.run()
|
||||
|
||||
Reference in New Issue
Block a user