228d481211
Java: - LLM 180s 读超时不再被全局 call-timeout 静默截断成 90s(长思考请求被掐断→重试→付费网关二次计费) - 代理 HttpClient 缓存改有界 LRU(jikip 每次提取新 IP,无界缓存持续泄漏 selector 线程与连接池) - 12 个 service 的 Redis 任务锁移出 @Transactional(自旋最坏 10s 白占 DB 连接,池仅 30),远端对象删/传改 afterCommit - 结果文件 Job 闸门拒绝时不再回退内联执行(改重新入队,避免把背压转嫁给 MQ 消费线程) - imagevideo 每秒扫描加列投影、过期清理加 LIMIT;权限页整表查询改列投影(不再拉回密码哈希) - 哈希改 HexFormat;补 5 处"不能改"的技术依据注释(批量插入会丢回填主键、流式丢模板与图片等) 前端:4 个工具页轮询改轻量端点(带 fallback);PriceTrack 快照节流写盘;候选店铺表分页;页面隐藏时停表 客户端:HTTP 连接池按出口复用(Session 仍每请求新建,保持无跨请求状态);品牌检测 WIPO 逐请求握手; 代理配置按 mtime 缓存;串行任务改专属池;异常降级为标签页重连;紫鸟启动改端口轮询;模板编译缓存; 日志上报连接与落盘收口;Flask 版本 API 改按请求复用连接
50 lines
1.6 KiB
Python
50 lines
1.6 KiB
Python
"""
|
||
数富AI - Flask 后端
|
||
管理后台(页面 web_source/ 与 /api/admin/* 蓝图)已整体迁移至 Java + Vue
|
||
(/admin-vue/,见 docs/specs/11-flask-removal-cutover.md,旧代码于 task-283 删除)。
|
||
本进程当前只保留客户端仍在使用的版本公开 API:/api/version、/api/version/latest
|
||
(桌面客户端 app_client 的更新检查仍以本进程 15124 为 base_url,切换前勿下线)。
|
||
"""
|
||
import os
|
||
import secrets
|
||
|
||
from flask import Flask
|
||
from flask_cors import CORS
|
||
|
||
from utils.db import close_db, init_db
|
||
from blueprints.version import version_bp
|
||
|
||
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
||
app = Flask(__name__)
|
||
|
||
# CORS配置:限制为可信域名(版本检查由桌面客户端/网页发起,跨域仍受限)
|
||
CORS(app, resources={
|
||
r"/api/*": {
|
||
"origins": [
|
||
"http://localhost:*",
|
||
"http://127.0.0.1:*",
|
||
"https://*.aishufu.top",
|
||
"http://*.aishufu.top"
|
||
],
|
||
"methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
|
||
"allow_headers": ["Authorization", "Content-Type", "X-Requested-With", "X-Device-Id"],
|
||
"supports_credentials": True
|
||
}
|
||
})
|
||
app.secret_key = os.environ.get('SECRET_KEY', secrets.token_hex(32))
|
||
|
||
# 注册蓝图:仅版本公开 API(管理后台 API 已迁 Java,见模块 docstring)
|
||
app.register_blueprint(version_bp)
|
||
|
||
# 请求级数据库连接随请求结束释放(utils/db.get_db 复用同一连接)
|
||
app.teardown_appcontext(close_db)
|
||
|
||
|
||
def run_app(host='0.0.0.0', port=15124):
|
||
init_db()
|
||
app.run(host=host, port=port, threaded=True, use_reloader=False)
|
||
|
||
|
||
if __name__ == '__main__':
|
||
run_app()
|