|
|
# 从flask模块导入Flask类,用于创建应用实例
|
|
|
from flask import Flask
|
|
|
|
|
|
# 从flask_sqlalchemy模块导入SQLAlchemy类,用于数据库操作
|
|
|
from flask_sqlalchemy import SQLAlchemy
|
|
|
|
|
|
# 从flask_login模块导入LoginManager类,用于用户认证管理
|
|
|
from flask_login import LoginManager
|
|
|
|
|
|
# 从config模块导入Config配置类
|
|
|
from config import Config
|
|
|
|
|
|
# 导入logging模块,用于日志记录
|
|
|
import logging
|
|
|
|
|
|
# 从logging.handlers模块导入RotatingFileHandler类,用于日志文件轮转
|
|
|
from logging.handlers import RotatingFileHandler
|
|
|
|
|
|
# 导入os模块,用于操作系统相关功能
|
|
|
import os
|
|
|
|
|
|
# 导入pymysql模块,用于MySQL数据库连接
|
|
|
import pymysql
|
|
|
|
|
|
# 初始化SQLAlchemy数据库扩展实例
|
|
|
db = SQLAlchemy()
|
|
|
|
|
|
# 初始化LoginManager登录管理扩展实例
|
|
|
login_manager = LoginManager()
|
|
|
|
|
|
# 设置登录视图为'auth.login',未登录用户将被重定向到该路由
|
|
|
login_manager.login_view = 'auth.login'
|
|
|
|
|
|
# 定义用户加载函数,用于LoginManager根据用户ID加载用户对象
|
|
|
@login_manager.user_loader
|
|
|
def load_user(id):
|
|
|
# 延迟导入User模型,避免循环导入
|
|
|
from app.models import User
|
|
|
# 根据ID查询并返回用户对象
|
|
|
return User.query.get(int(id))
|
|
|
|
|
|
# 定义应用工厂函数,用于创建Flask应用实例
|
|
|
def create_app(config_class=Config):
|
|
|
# 创建Flask应用实例,指定模板和静态文件目录
|
|
|
app = Flask(__name__,
|
|
|
template_folder='templates',
|
|
|
static_folder='static')
|
|
|
# 从配置类加载应用配置
|
|
|
app.config.from_object(config_class)
|
|
|
|
|
|
# 尝试创建数据库连接并创建应用数据库
|
|
|
try:
|
|
|
# 建立MySQL数据库连接
|
|
|
connection = pymysql.connect(
|
|
|
host='127.0.0.1', # 数据库主机地址
|
|
|
user='root', # 数据库用户名
|
|
|
password='123456' # 数据库密码
|
|
|
)
|
|
|
# 使用游标执行SQL语句创建数据库
|
|
|
with connection.cursor() as cursor:
|
|
|
# 创建数据库yangzhiappdb,设置字符集为utf8mb4
|
|
|
cursor.execute("CREATE DATABASE IF NOT EXISTS yangzhiappdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci")
|
|
|
# 关闭数据库连接
|
|
|
connection.close()
|
|
|
except Exception as e:
|
|
|
# 记录数据库创建错误日志
|
|
|
app.logger.error(f"创建数据库时出错: {str(e)}")
|
|
|
# 抛出异常
|
|
|
raise e
|
|
|
|
|
|
# 初始化数据库扩展,将db与应用关联
|
|
|
db.init_app(app)
|
|
|
# 初始化登录管理扩展,将login_manager与应用关联
|
|
|
login_manager.init_app(app)
|
|
|
|
|
|
# 注册各个功能模块的蓝图
|
|
|
from app.routes import main, auth, api, monitor, history, alarm, user
|
|
|
# 注册主页面蓝图
|
|
|
app.register_blueprint(main.bp)
|
|
|
# 注册认证蓝图
|
|
|
app.register_blueprint(auth.bp)
|
|
|
# 注册API蓝图
|
|
|
app.register_blueprint(api.bp)
|
|
|
# 注册监控蓝图
|
|
|
app.register_blueprint(monitor.bp)
|
|
|
# 注册历史数据蓝图
|
|
|
app.register_blueprint(history.bp)
|
|
|
# 注册告警蓝图
|
|
|
app.register_blueprint(alarm.bp)
|
|
|
# 注册用户管理蓝图
|
|
|
app.register_blueprint(user.bp)
|
|
|
|
|
|
# 确保应用实例文件夹存在,用于存储应用特定文件
|
|
|
try:
|
|
|
os.makedirs(app.instance_path)
|
|
|
except OSError:
|
|
|
# 如果文件夹已存在则忽略错误
|
|
|
pass
|
|
|
|
|
|
# 配置应用日志系统(仅在非调试模式下)
|
|
|
if not app.debug:
|
|
|
# 检查logs目录是否存在,不存在则创建
|
|
|
if not os.path.exists('logs'):
|
|
|
os.mkdir('logs')
|
|
|
# 创建日志文件轮转处理器,最大10KB,保留10个备份文件
|
|
|
file_handler = RotatingFileHandler('logs/yangzhiapp.log', maxBytes=10240, backupCount=10)
|
|
|
# 设置日志格式
|
|
|
file_handler.setFormatter(logging.Formatter(
|
|
|
'%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
|
|
|
))
|
|
|
# 设置日志级别为INFO
|
|
|
file_handler.setLevel(logging.INFO)
|
|
|
# 将处理器添加到应用日志记录器
|
|
|
app.logger.addHandler(file_handler)
|
|
|
# 设置应用日志记录器级别为INFO
|
|
|
app.logger.setLevel(logging.INFO)
|
|
|
# 记录应用启动日志
|
|
|
app.logger.info('Yangzhi App startup')
|
|
|
|
|
|
# 在应用上下文中创建数据库表
|
|
|
with app.app_context():
|
|
|
# 根据模型定义创建所有数据库表
|
|
|
db.create_all()
|
|
|
|
|
|
# 返回创建的应用实例
|
|
|
return app
|