CHECKOK
This commit is contained in:
@@ -138,6 +138,13 @@ def create_app(config_name=None):
|
||||
# 初始化 WebSocket
|
||||
from app.websocket import init_websocket
|
||||
app.socketio = init_websocket(app)
|
||||
|
||||
# 註冊 Root 路由(提供 SPA 與基本 API 資訊)
|
||||
try:
|
||||
from app.root import root_bp
|
||||
app.register_blueprint(root_bp)
|
||||
except Exception as e:
|
||||
app.logger.warning(f"Root routes not registered: {e}")
|
||||
|
||||
app.logger.info("Flask application created successfully")
|
||||
return app
|
||||
@@ -215,4 +222,4 @@ def create_default_admin():
|
||||
print(f"Failed to create default admin: {str(e)}")
|
||||
|
||||
|
||||
# 導入模型在需要時才進行,避免循環導入
|
||||
# 導入模型在需要時才進行,避免循環導入
|
||||
|
64
app/root.py
Normal file
64
app/root.py
Normal file
@@ -0,0 +1,64 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Root routes and static file serving for SPA in production.
|
||||
|
||||
These were originally defined in the top-level app.py. Moving them into the
|
||||
package allows a clean WSGI entry (wsgi:app) without importing app.py.
|
||||
"""
|
||||
|
||||
from datetime import datetime
|
||||
from flask import Blueprint, current_app, send_from_directory
|
||||
|
||||
root_bp = Blueprint('root', __name__)
|
||||
|
||||
|
||||
@root_bp.route('/')
|
||||
def index():
|
||||
try:
|
||||
return send_from_directory('/app/static', 'index.html')
|
||||
except Exception:
|
||||
# Fallback API info when frontend is not present
|
||||
return {
|
||||
'application': 'PANJIT Document Translator',
|
||||
'version': '1.0.0',
|
||||
'status': 'running',
|
||||
'api_base_url': '/api/v1',
|
||||
'note': 'Frontend files not found, serving API info'
|
||||
}
|
||||
|
||||
|
||||
@root_bp.route('/<path:path>')
|
||||
def serve_static(path):
|
||||
try:
|
||||
return send_from_directory('/app/static', path)
|
||||
except Exception:
|
||||
# SPA fallback
|
||||
return send_from_directory('/app/static', 'index.html')
|
||||
|
||||
|
||||
@root_bp.route('/api')
|
||||
def api_info():
|
||||
return {
|
||||
'api_version': 'v1',
|
||||
'base_url': '/api/v1',
|
||||
'endpoints': {
|
||||
'auth': '/api/v1/auth',
|
||||
'files': '/api/v1/files',
|
||||
'jobs': '/api/v1/jobs',
|
||||
'admin': '/api/v1/admin',
|
||||
'health': '/api/v1/health'
|
||||
},
|
||||
'documentation': 'Available endpoints provide RESTful API for document translation'
|
||||
}
|
||||
|
||||
|
||||
@root_bp.route('/api/health')
|
||||
def health_check():
|
||||
# Keep a simple health endpoint here for compatibility
|
||||
return {
|
||||
'status': 'healthy',
|
||||
'timestamp': datetime.utcnow().isoformat(),
|
||||
'service': 'PANJIT Document Translator API',
|
||||
'version': '1.0.0'
|
||||
}, 200
|
@@ -8,6 +8,7 @@ Created: 2024-01-28
|
||||
Modified: 2024-01-28
|
||||
"""
|
||||
|
||||
import os
|
||||
from flask_socketio import SocketIO, emit, join_room, leave_room, disconnect
|
||||
from flask_jwt_extended import decode_token, get_jwt
|
||||
from flask import request
|
||||
@@ -17,7 +18,9 @@ import logging
|
||||
# 初始化 SocketIO
|
||||
socketio = SocketIO(
|
||||
cors_allowed_origins="*",
|
||||
async_mode='threading',
|
||||
# Use eventlet for production and enable Redis message queue for multi-process/replica support
|
||||
async_mode='eventlet',
|
||||
message_queue=os.getenv('REDIS_URL'),
|
||||
logger=True,
|
||||
engineio_logger=False
|
||||
)
|
||||
@@ -227,4 +230,4 @@ def init_websocket(app):
|
||||
"""
|
||||
socketio.init_app(app)
|
||||
logger.info("WebSocket initialized")
|
||||
return socketio
|
||||
return socketio
|
||||
|
Reference in New Issue
Block a user