__init__.py 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. from flask import Flask
  2. from flask_sqlalchemy import SQLAlchemy
  3. from flask_cors import CORS
  4. import logging
  5. from app.config.config import config, current_env
  6. import os
  7. db = SQLAlchemy()
  8. def create_app():
  9. """Create and configure the Flask application"""
  10. app = Flask(__name__)
  11. # 加载配置
  12. app.config.from_object(config[current_env])
  13. # 初始化扩展
  14. CORS(app)
  15. db.init_app(app)
  16. # 注册蓝图
  17. from app.api.meta_data import bp as meta_bp
  18. from app.api.data_resource import bp as resource_bp
  19. from app.api.data_model import bp as data_model_bp
  20. from app.api.data_interface import bp as data_interface_bp
  21. from app.api.data_metric import bp as data_metric_bp
  22. from app.api.production_line import bp as production_line_bp
  23. from app.api.graph import bp as graph_bp
  24. from app.api.system import bp as system_bp
  25. from app.api.data_source import bp as data_source_bp
  26. from app.api.data_parse import bp as data_parse_bp
  27. from app.api.data_flow import bp as data_flow_bp
  28. app.register_blueprint(meta_bp, url_prefix='/api/meta')
  29. app.register_blueprint(resource_bp, url_prefix='/api/resource')
  30. app.register_blueprint(data_model_bp, url_prefix='/api/model')
  31. app.register_blueprint(data_interface_bp, url_prefix='/api/interface')
  32. app.register_blueprint(data_metric_bp, url_prefix='/api/metric')
  33. app.register_blueprint(production_line_bp, url_prefix='/api/pipeline')
  34. app.register_blueprint(graph_bp, url_prefix='/api/graph')
  35. app.register_blueprint(system_bp, url_prefix='/api/system')
  36. app.register_blueprint(data_source_bp, url_prefix='/api/datasource')
  37. app.register_blueprint(data_parse_bp, url_prefix='/api/parse')
  38. app.register_blueprint(data_flow_bp, url_prefix='/api/dataflow')
  39. # Configure logging
  40. configure_logging(app)
  41. # 输出启动信息
  42. app.logger.info(f"Starting server in {current_env} mode on port {app.config['PORT']}")
  43. return app
  44. def configure_logging(app):
  45. """Configure logging for the application"""
  46. if not app.config.get('LOG_ENABLED', True):
  47. return None
  48. log_file = app.config.get('LOG_FILE', f'flask_{app.config["FLASK_ENV"]}.log')
  49. log_level_name = app.config.get('LOG_LEVEL', 'INFO')
  50. log_level = getattr(logging, log_level_name)
  51. log_format = app.config.get('LOG_FORMAT', '%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - %(message)s')
  52. log_encoding = app.config.get('LOG_ENCODING', 'UTF-8')
  53. log_to_console = app.config.get('LOG_TO_CONSOLE', True)
  54. # 配置根日志器
  55. root_logger = logging.getLogger()
  56. root_logger.setLevel(log_level)
  57. # 清除所有现有处理器
  58. root_logger.handlers.clear()
  59. # 文件处理器 - 只添加到根日志器
  60. file_handler = logging.FileHandler(log_file, encoding=log_encoding)
  61. file_handler.setLevel(log_level)
  62. logging_format = logging.Formatter(log_format)
  63. file_handler.setFormatter(logging_format)
  64. root_logger.addHandler(file_handler)
  65. # 控制台处理器 - 只添加到根日志器
  66. if log_to_console:
  67. console = logging.StreamHandler()
  68. console.setLevel(log_level)
  69. console.setFormatter(logging_format)
  70. root_logger.addHandler(console)
  71. # 确保Flask内部日志器使用我们的配置
  72. app.logger.handlers.clear() # 移除Flask默认处理器
  73. # 配置app日志器,但禁止传播到根日志器
  74. logger = logging.getLogger("app")
  75. logger.setLevel(log_level)
  76. logger.handlers.clear() # 清除现有处理器
  77. logger.propagate = True # 通过根日志器处理
  78. app.logger.info(f"日志配置完成: 级别={log_level_name}, 文件={log_file}")
  79. return logger