#!/usr/bin/env python3 """ AI图片生成器 - 程序入口 统一启动前后端服务,部署在 0.0.0.0:7700 端口 """ import os import sys from flask import Flask, send_from_directory, send_file from flask_cors import CORS # 添加项目根目录到Python路径 project_root = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, project_root) # 导入后端模块 from backend.apis.generate import generate_bp from backend.apis.prompts import prompts_bp from backend.apis.history import history_bp from backend.apis.upload import upload_bp from backend.apis.random_options import random_options_bp from backend.models.database import init_database def create_app(): """创建Flask应用""" app = Flask(__name__, static_folder=None) # 禁用默认静态文件夹 # 配置 app.config['SECRET_KEY'] = 'ai-image-generator-secret-key-2024' app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 16MB文件上传限制 # 启用CORS CORS(app) # 注册API蓝图 app.register_blueprint(generate_bp) app.register_blueprint(prompts_bp) app.register_blueprint(history_bp) app.register_blueprint(upload_bp) app.register_blueprint(random_options_bp) # 静态文件路由 @app.route('/') def index(): """主页""" import os project_root = os.path.dirname(os.path.abspath(__file__)) index_path = os.path.join(project_root, 'frontend', 'pages', 'index.html') return send_file(index_path) @app.route('/static/') def static_files(filename): """静态文件服务""" import os # 获取项目根目录 project_root = os.path.dirname(os.path.abspath(__file__)) # 根据文件路径确定目录 if filename.startswith('assets/'): directory = os.path.join(project_root, 'frontend') return send_from_directory(directory, filename) elif filename.startswith('components/'): directory = os.path.join(project_root, 'frontend') return send_from_directory(directory, filename) elif filename.startswith('utils/'): directory = os.path.join(project_root, 'frontend') return send_from_directory(directory, filename) elif filename.startswith('pages/'): directory = os.path.join(project_root, 'frontend') return send_from_directory(directory, filename) else: # 默认从frontend目录查找 directory = os.path.join(project_root, 'frontend') return send_from_directory(directory, filename) # 错误处理 @app.errorhandler(404) def not_found(error): """404错误处理""" return {'error': '页面不存在'}, 404 @app.errorhandler(500) def internal_error(error): """500错误处理""" return {'error': '服务器内部错误'}, 500 @app.errorhandler(413) def file_too_large(error): """文件过大错误处理""" return {'error': '上传文件过大,请选择小于16MB的文件'}, 413 # 健康检查接口 @app.route('/health') def health_check(): """健康检查""" return {'status': 'ok', 'message': 'AI图片生成器运行正常'} return app def setup_logging(): """设置日志""" import logging from logging.handlers import RotatingFileHandler # 确保日志目录存在 log_dir = os.path.join(project_root, 'logs') os.makedirs(log_dir, exist_ok=True) # 配置日志格式 formatter = logging.Formatter( '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]' ) # 文件日志处理器 file_handler = RotatingFileHandler( os.path.join(log_dir, 'app.log'), maxBytes=10240000, # 10MB backupCount=10 ) file_handler.setFormatter(formatter) file_handler.setLevel(logging.INFO) # 控制台日志处理器 console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) console_handler.setLevel(logging.INFO) # 配置根日志记录器 root_logger = logging.getLogger() root_logger.setLevel(logging.INFO) root_logger.addHandler(file_handler) root_logger.addHandler(console_handler) def check_environment(): """检查运行环境""" print("=" * 50) print("AI图片生成器 - 环境检查") print("=" * 50) # 检查Python版本 python_version = sys.version_info print(f"Python版本: {python_version.major}.{python_version.minor}.{python_version.micro}") if python_version < (3, 7): print("❌ Python版本过低,需要Python 3.7或更高版本") sys.exit(1) else: print("✅ Python版本符合要求") # 检查必要的目录 required_dirs = [ 'frontend/pages', 'frontend/components', 'frontend/utils', 'frontend/assets', 'backend/apis', 'backend/models', 'backend/utils', 'backend/database', 'model_prompt', 'logs' ] for dir_path in required_dirs: full_path = os.path.join(project_root, dir_path) if os.path.exists(full_path): print(f"✅ 目录存在: {dir_path}") else: print(f"❌ 目录缺失: {dir_path}") os.makedirs(full_path, exist_ok=True) print(f"✅ 已创建目录: {dir_path}") print("=" * 50) def main(): """主函数""" try: # 环境检查 check_environment() # 设置日志 setup_logging() # 初始化数据库 print("初始化数据库...") init_database() print("✅ 数据库初始化完成") # 创建Flask应用 app = create_app() # 启动信息 print("\n" + "=" * 50) print("🚀 AI图片生成器启动中...") print("=" * 50) print(f"📍 访问地址: http://localhost:7700") print(f"📍 本地访问: http://127.0.0.1:7700") print(f"📍 网络访问: http://0.0.0.0:7700") print(f"📍 健康检查: http://localhost:7700/health") # 启动Flask服务器 app.run( host='0.0.0.0', port=7700, debug=True, # 生产环境关闭debug模式 threaded=True # 启用多线程支持 ) except KeyboardInterrupt: print("\n" + "=" * 50) print("🛑 用户中断,服务器已停止") print("=" * 50) except Exception as e: print(f"\n❌ 启动失败: {str(e)}") print("请检查错误信息并重试") sys.exit(1) if __name__ == '__main__': main()