first commit
This commit is contained in:
89
app.py
Normal file
89
app.py
Normal file
@@ -0,0 +1,89 @@
|
||||
import os
|
||||
import sys
|
||||
import logging
|
||||
|
||||
from flask import Flask
|
||||
from lib.config import load_config, get_web_config, get_limits_config
|
||||
from lib.log_handler import setup_logging
|
||||
from lib.db import init_database
|
||||
|
||||
app = Flask(__name__,
|
||||
template_folder=os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates'),
|
||||
static_folder=os.path.join(os.path.dirname(os.path.abspath(__file__)), 'static'))
|
||||
|
||||
# MAX_CONTENT_LENGTH:SRS 9.1 要求 docx ≤1MB、image ≤256KB。
|
||||
# JSON 请求体的 Base64 编码会让 docx 膨胀约 33%,叠加多图章项后取 4MB 比较保守。
|
||||
# 真正的硬限制由 lib/validators.validate_docx_size 在解码后强制。
|
||||
app.config['MAX_CONTENT_LENGTH'] = 8 * 1024 * 1024
|
||||
|
||||
from routes.pages import pages_bp
|
||||
from routes.api import api_bp
|
||||
from routes.db_api import db_api_bp
|
||||
from routes.batch_api import batch_api_bp
|
||||
from routes.monitor_api import monitor_api_bp
|
||||
|
||||
app.register_blueprint(pages_bp)
|
||||
app.register_blueprint(api_bp)
|
||||
app.register_blueprint(db_api_bp)
|
||||
app.register_blueprint(batch_api_bp)
|
||||
app.register_blueprint(monitor_api_bp)
|
||||
|
||||
|
||||
def ensure_dirs():
|
||||
base = os.path.dirname(os.path.abspath(__file__))
|
||||
for d in ['temp', 'logs', 'output', 'data', 'static', 'static/css', 'static/js']:
|
||||
os.makedirs(os.path.join(base, d), exist_ok=True)
|
||||
|
||||
|
||||
def main():
|
||||
load_config()
|
||||
setup_logging()
|
||||
ensure_dirs()
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
logger.info("===== 自动签名系统启动 =====")
|
||||
|
||||
limits = get_limits_config()
|
||||
logger.info("限制配置: docx_max=%d bytes, image_max=%d bytes, stamp_max=%d, log_max=%d",
|
||||
limits['docx_max_bytes'], limits['image_max_bytes'],
|
||||
limits['stamp_max_count'], limits['log_max_entries'])
|
||||
|
||||
try:
|
||||
ok = init_database(strict_mysql=False)
|
||||
if not ok:
|
||||
logger.error("数据库初始化失败(MySQL 不可用且 strict 模式)")
|
||||
else:
|
||||
from lib.db import get_active_db_type
|
||||
db_type = get_active_db_type()
|
||||
logger.info("数据库初始化完成, 当前使用: %s", db_type.upper())
|
||||
except Exception as e:
|
||||
logger.error("数据库初始化失败: %s", str(e))
|
||||
|
||||
web_cfg = get_web_config()
|
||||
host = web_cfg['host']
|
||||
port = web_cfg['port']
|
||||
debug = web_cfg['debug']
|
||||
|
||||
logger.info("Web服务: %s:%d, debug=%s", host, port, debug)
|
||||
|
||||
if debug:
|
||||
app.run(host=host, port=port, debug=True)
|
||||
else:
|
||||
try:
|
||||
from waitress import serve
|
||||
logger.info("使用 Waitress 生产服务器")
|
||||
try:
|
||||
serve(app, host=host, port=port, threads=4)
|
||||
except OSError:
|
||||
if port == 5001:
|
||||
logger.warning("端口 %d 被占用或无权限, 尝试端口 5002", port)
|
||||
serve(app, host=host, port=5002, threads=4)
|
||||
else:
|
||||
raise
|
||||
except ImportError:
|
||||
logger.warning("Waitress 未安装, 使用 Flask 开发服务器")
|
||||
app.run(host=host, port=port, debug=False)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user