#!/usr/bin/env python # -*- coding: utf-8 -*- """ Flask网关系统启动脚本 """
import os import sys import argparse from dotenv import load_dotenv
def print_banner(): """打印启动横幅""" banner = """ ╔══════════════════════════════════════════════════════════════╗ ║ Flask网关系统 v1.0 ║ ║ ║ ║ 统一入口 | 集成管理 | 安全可靠 ║ ╚══════════════════════════════════════════════════════════════╝ """ print(banner)
def check_dependencies(): """检查依赖包""" required_packages = { 'flask': 'Flask', 'dotenv': 'python-dotenv', 'werkzeug': 'Werkzeug' } missing_packages = [] for module_name, package_name in required_packages.items(): try: __import__(module_name) except ImportError: missing_packages.append(package_name) if missing_packages: print('❌ 缺少必需的依赖包:') for package in missing_packages: print(f' - {package}') print('\n请运行以下命令安装依赖:') print(' pip install -r requirements.txt') sys.exit(1) # 检查Python版本 if sys.version_info < (3, 8): print('❌ Python版本过低,需要Python 3.8或更高版本') print(f' 当前版本: Python {sys.version_info.major}.{sys.version_info.minor}') sys.exit(1)
def load_environment(): """加载环境变量""" # 只加载网关自己的配置 # 子应用的配置由子应用自己在加载时处理,避免环境变量冲突 env_file = '.env' if os.path.exists(env_file): print(f'✓ 加载网关配置: {env_file}') load_dotenv(env_file) else: print(f'⚠ 未找到配置文件: {env_file},使用默认配置') # 动态检查所有子应用的配置文件(仅提示,不加载) from app.config import Config parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) print('\n检查子应用配置文件:') for app_config in Config.SUB_APPS: app_name = app_config['name'] app_path = app_config['path'] # 计算实际路径 if not os.path.isabs(app_path): app_path = os.path.join(parent_dir, app_path) # 尝试查找配置文件(按优先级) possible_env_files = ['.env', '.env.dev', '.env.local', '.env.example'] env_found = False for env_file_name in possible_env_files: env_path = os.path.join(app_path, env_file_name) if os.path.exists(env_path): print(f' ✓ {app_name}: {env_path}') env_found = True break if not env_found: print(f' ⚠ {app_name}: 未找到配置文件 ({app_path})')
def parse_args(): """解析命令行参数""" parser = argparse.ArgumentParser(description='Flask网关系统') parser.add_argument('--host', '-H', default=os.environ.get('GATEWAY_HOST', '127.0.0.1'), help='服务主机 (默认: 127.0.0.1)') parser.add_argument('--port', '-p', type=int, default=int(os.environ.get('GATEWAY_PORT', 8000)), help='服务端口 (默认: 8000)') parser.add_argument('--config', '-c', choices=['development', 'production', 'testing', 'default'], default=os.environ.get('FLASK_CONFIG', 'development'), help='配置环境 (默认: development)') parser.add_argument('--debug', '-d', action='store_true', help='启用调试模式') return parser.parse_args()
def main(): """主函数""" # 打印横幅 print_banner() # 检查依赖 print('正在检查依赖...') check_dependencies() print('✓ 依赖检查通过\n') # 添加当前目录到Python路径 sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) # 加载环境变量 print('正在加载配置...') load_environment() print() # 解析命令行参数 args = parse_args() # 更新环境变量 os.environ['FLASK_CONFIG'] = args.config os.environ['GATEWAY_HOST'] = args.host os.environ['GATEWAY_PORT'] = str(args.port) try: # 导入应用 from app import create_app # 创建应用 print(f'正在创建应用实例 (配置: {args.config})...') app = create_app(args.config) print('✓ 应用创建成功\n') # 显示已注册的子应用 if hasattr(app, '_sub_apps') and app._sub_apps: print('已注册的子应用:') for url_prefix in app._sub_apps.keys(): print(f' - {url_prefix}') print() # 启动应用 debug_mode = args.debug or args.config in ['development', 'default'] print('=' * 60) print(f'🚀 Flask网关系统启动成功!') print(f'📊 配置环境: {args.config}') print(f'🌐 访问地址: http://{args.host}:{args.port}') print(f'🔧 调试模式: {"开启" if debug_mode else "关闭"}') print('=' * 60) print('\n按 Ctrl+C 停止服务器\n') app.run( host=args.host, port=args.port, debug=debug_mode, use_reloader=debug_mode ) except KeyboardInterrupt: print('\n\n正在关闭服务器...') print('✓ 服务器已关闭') sys.exit(0) except Exception as e: print(f'\n❌ 启动失败: {str(e)}') import traceback traceback.print_exc() sys.exit(1)
if __name__ == '__main__': main()
|