12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- from flask import Flask
- from flask_sqlalchemy import SQLAlchemy
- from flask_cors import CORS
- import logging
- from app.config.config import config, current_env
- import os
- db = SQLAlchemy()
- def create_app():
- """Create and configure the Flask application"""
- app = Flask(__name__)
-
- # 加载配置
- app.config.from_object(config[current_env])
-
- # 初始化扩展
- CORS(app)
- db.init_app(app)
-
- # 注册蓝图
- from app.api.meta_data import bp as meta_bp
- from app.api.data_resource import bp as resource_bp
- from app.api.data_model import bp as data_model_bp
- from app.api.data_interface import bp as data_interface_bp
- from app.api.data_metric import bp as data_metric_bp
- from app.api.production_line import bp as production_line_bp
- from app.api.graph import bp as graph_bp
- from app.api.system import bp as system_bp
-
- app.register_blueprint(meta_bp, url_prefix='/api/meta')
- app.register_blueprint(resource_bp, url_prefix='/api/resource')
- app.register_blueprint(data_model_bp, url_prefix='/api/model')
- app.register_blueprint(data_interface_bp, url_prefix='/api/interface')
- app.register_blueprint(data_metric_bp, url_prefix='/api/metric')
- app.register_blueprint(production_line_bp, url_prefix='/api/pipeline')
- app.register_blueprint(graph_bp, url_prefix='/api/graph')
- app.register_blueprint(system_bp, url_prefix='/api/system')
-
- # Configure logging
- configure_logging(app)
-
- # 输出启动信息
- app.logger.info(f"Starting server in {current_env} mode on port {app.config['PORT']}")
-
- return app
- def configure_logging(app):
- """Configure logging for the application"""
- if not app.config.get('LOG_ENABLED', True):
- return None
-
- log_file = app.config.get('LOG_FILE', f'flask_{app.config["FLASK_ENV"]}.log')
- log_level_name = app.config.get('LOG_LEVEL', 'INFO')
- log_level = getattr(logging, log_level_name)
- log_format = app.config.get('LOG_FORMAT', '%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - %(message)s')
- log_encoding = app.config.get('LOG_ENCODING', 'UTF-8')
- log_to_console = app.config.get('LOG_TO_CONSOLE', True)
-
- # 配置根日志器
- root_logger = logging.getLogger()
- root_logger.setLevel(log_level)
-
- # 清除所有现有处理器
- root_logger.handlers.clear()
-
- # 文件处理器 - 只添加到根日志器
- file_handler = logging.FileHandler(log_file, encoding=log_encoding)
- file_handler.setLevel(log_level)
- logging_format = logging.Formatter(log_format)
- file_handler.setFormatter(logging_format)
- root_logger.addHandler(file_handler)
-
- # 控制台处理器 - 只添加到根日志器
- if log_to_console:
- console = logging.StreamHandler()
- console.setLevel(log_level)
- console.setFormatter(logging_format)
- root_logger.addHandler(console)
-
- # 确保Flask内部日志器使用我们的配置
- app.logger.handlers.clear() # 移除Flask默认处理器
-
- # 配置app日志器,但禁止传播到根日志器
- logger = logging.getLogger("app")
- logger.setLevel(log_level)
- logger.handlers.clear() # 清除现有处理器
- logger.propagate = True # 通过根日志器处理
-
- app.logger.info(f"日志配置完成: 级别={log_level_name}, 文件={log_file}")
- return logger
|