Files
2025-09-04 16:37:33 +08:00

159 lines
4.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Document Translator Flask 應用程式入口
Author: PANJIT IT Team
Created: 2024-01-28
Modified: 2024-01-28
"""
import os
import sys
from pathlib import Path
from datetime import datetime
# 添加專案根目錄到 Python 路徑
project_root = Path(__file__).parent
sys.path.insert(0, str(project_root))
from app import create_app, db
from app.models import User, TranslationJob, JobFile, TranslationCache, APIUsageStats, SystemLog
# 創建 Flask 應用
app = create_app()
# 導出 Celery 實例供 worker 使用
celery = app.celery
# 確保在模組級別可以訪問
__all__ = ['app', 'celery']
@app.shell_context_processor
def make_shell_context():
"""為 Flask shell 提供上下文"""
return {
'db': db,
'User': User,
'TranslationJob': TranslationJob,
'JobFile': JobFile,
'TranslationCache': TranslationCache,
'APIUsageStats': APIUsageStats,
'SystemLog': SystemLog
}
@app.cli.command()
def init_db():
"""初始化資料庫"""
click.echo('Initializing database...')
db.create_all()
click.echo('Database initialized.')
@app.cli.command()
def test():
"""運行測試"""
import unittest
tests = unittest.TestLoader().discover('tests')
unittest.TextTestRunner(verbosity=2).run(tests)
@app.route('/')
def index():
"""首頁路由 - 服務前端應用"""
try:
from flask import send_from_directory
return send_from_directory('/app/static', 'index.html')
except Exception as e:
# 如果靜態文件不存在返回API信息
return {
'application': 'PANJIT Document Translator',
'version': '1.0.0',
'status': 'running',
'api_base_url': '/api/v1',
'note': 'Frontend files not found, serving API info'
}
@app.route('/<path:path>')
def serve_static(path):
"""服務靜態文件"""
try:
from flask import send_from_directory
return send_from_directory('/app/static', path)
except Exception:
# 如果文件不存在返回index.html (SPA路由)
return send_from_directory('/app/static', 'index.html')
@app.route('/api')
def api_info():
"""API 資訊"""
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'
}
@app.route('/api/health')
@app.route('/api/v1/health')
def health_check():
"""健康檢查端點"""
return {
'status': 'healthy',
'timestamp': datetime.utcnow().isoformat(),
'service': 'PANJIT Document Translator API',
'version': '1.0.0'
}, 200
if __name__ == '__main__':
# 檢查環境變數
port = int(os.environ.get('PORT', 12010))
debug = os.environ.get('FLASK_DEBUG', 'false').lower() == 'true'
host = os.environ.get('HOST', '0.0.0.0')
# 只在主進程或非 debug 模式下顯示啟動訊息
# 在 debug 模式下Flask 會創建兩個進程,只在 reloader 主進程顯示訊息
if not debug or os.environ.get('WERKZEUG_RUN_MAIN'):
print(f"""
PANJIT Document Translator Starting...
Server: http://{host}:{port}
Debug Mode: {debug}
API Documentation: http://{host}:{port}/api
Health Check: http://{host}:{port}/api/v1/health
Upload Directory: {app.config.get('UPLOAD_FOLDER')}
Database: {app.config.get('SQLALCHEMY_DATABASE_URI', '').split('/')[-1]}
SMTP: {app.config.get('SMTP_SERVER')}
LDAP: {app.config.get('LDAP_SERVER')}
Press Ctrl+C to stop the server.
""")
# 啟動應用
try:
app.run(
host=host,
port=port,
debug=debug,
use_reloader=debug
)
except KeyboardInterrupt:
if not debug or os.environ.get('WERKZEUG_RUN_MAIN'):
print("\nServer stopped by user.")
except Exception as e:
if not debug or os.environ.get('WERKZEUG_RUN_MAIN'):
print(f"\nServer failed to start: {str(e)}")
sys.exit(1)