Files
nonye/back/app.py

168 lines
5.7 KiB
Python
Raw Normal View History

2025-07-17 23:13:04 +08:00
from flask import Flask, g
from flask_cors import CORS
import sqlite3
import os
import re
def create_app():
app = Flask(__name__)
# 加载配置文件
app.config.from_pyfile('config.py')
# 数据库路径
db_path = os.path.join(os.getcwd(), 'agriculture.db')
app.config['DATABASE'] = db_path
def get_db():
"""获取数据库连接"""
if 'db' not in g:
g.db = sqlite3.connect(
app.config['DATABASE'],
check_same_thread=False
)
g.db.row_factory = sqlite3.Row
return g.db
def init_db():
"""初始化数据库(创建表),只执行一次"""
with app.app_context():
db = get_db()
cursor = db.cursor()
# 创建元数据表(用于记录初始化状态)
cursor.execute("""
CREATE TABLE IF NOT EXISTS metadata (
key TEXT PRIMARY KEY,
value TEXT
)
""")
# 检查是否已初始化
cursor.execute("SELECT value FROM metadata WHERE key = 'initialized'")
initialized = cursor.fetchone()
if initialized and initialized[0] == '1':
print("✅ 数据库已初始化,跳过初始化过程")
return
# 获取 schema.sql 文件路径
schema_path = os.path.join(app.root_path, 'schema.sql')
# 以 UTF-8 编码读取文件内容
with open(schema_path, 'r', encoding='utf-8') as f:
sql_content = f.read()
# 移除注释并分割SQL语句
sql_content = re.sub(r'--.*$', '', sql_content, flags=re.MULTILINE)
sql_statements = re.split(r';\s*', sql_content)
# 执行每个SQL语句
for i, stmt in enumerate(sql_statements, 1):
stmt = stmt.strip()
if stmt: # 跳过空语句
try:
cursor.execute(stmt)
print(f"✅ 执行SQL语句 {i} 成功")
except sqlite3.Error as e:
db.rollback()
print(f"❌ 执行SQL语句 {i} 失败: {str(e)}")
print(f" 语句内容: {stmt}")
# 标记数据库已初始化
cursor.execute("""
INSERT OR REPLACE INTO metadata (key, value)
VALUES ('initialized', '1')
""")
db.commit()
print("✅ 数据库初始化完成")
# 在应用启动时自动初始化数据库
init_db()
@app.teardown_appcontext
def close_db(exception):
"""在每次请求后关闭数据库连接"""
db = g.pop('db', None)
if db is not None:
db.close()
# 提供给蓝图使用的 db 获取方式
app.get_db = get_db
# 启用 CORS跨域支持
CORS(app,
resources={r"/*": {
"origins": [
"http://localhost:8080",
"http://127.0.0.1:8080",
"http://[::1]:8080",
"http://localhost:5173",
"http://127.0.0.1:5173",
"http://[::1]:5173"
],
"supports_credentials": True,
"allow_headers": ["Content-Type", "Authorization"],
"methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"]
}})
# 注册蓝图
from blueprints.login import bp as login_bp
from blueprints.register import bp as register_bp
from blueprints.yzm import bp as yzm_bp
from blueprints.weather import bp as weather_bp
from blueprints.shebei import bp as shebei_bp
from blueprints.device import bp as device_bp
from blueprints.personnel import bp as personnel_bp
from blueprints.aiask import bp as aiask_bp
from blueprints.temperature import bp as temperature_bp
from blueprints.ph_data import bp as ph_data_bp
from blueprints.wendu import bp as wendu_bp
from blueprints.chohai import bp as chohai_bp
from blueprints.shi1 import bp as shi1_bp
from blueprints.shi2 import bp as shi2_bp
from blueprints.tem import tem_bp
from blueprints.device_warning import bp as device_warning_bp
from blueprints.chou1 import bp as chou1_bp
from blueprints.chou2 import bp as chou2_bp
from blueprints.chou3 import bp as chou3_bp
from blueprints.liebiao import bp as liebiao_bp
from blueprints.guan import bp as guan_bp
app.register_blueprint(login_bp)
app.register_blueprint(register_bp)
app.register_blueprint(yzm_bp)
app.register_blueprint(weather_bp)
app.register_blueprint(shebei_bp)
app.register_blueprint(device_bp)
app.register_blueprint(personnel_bp)
app.register_blueprint(aiask_bp, url_prefix='/aiask')
app.register_blueprint(temperature_bp)
app.register_blueprint(ph_data_bp, url_prefix='/ph_data')
app.register_blueprint(wendu_bp)
app.register_blueprint(chohai_bp)
app.register_blueprint(shi1_bp)
app.register_blueprint(shi2_bp)
app.register_blueprint(tem_bp, url_prefix='/api')
app.register_blueprint(device_warning_bp)
app.register_blueprint(chou1_bp)
app.register_blueprint(chou2_bp)
app.register_blueprint(chou3_bp)
app.register_blueprint(liebiao_bp)
app.register_blueprint(guan_bp)
with app.app_context():
try:
from blueprints.chou1 import load_prediction_model
load_prediction_model()
print("✅ 预测模型已加载")
except Exception as e:
print(f"❌ 加载预测模型失败: {str(e)}")
return app
if __name__ == '__main__':
app = create_app()
app.run(debug=True)