You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

127 lines
4.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 从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