Files
xiaozhi-esp32-server/core/http_server.py
T
2025-02-15 12:30:20 +08:00

63 lines
2.1 KiB
Python

import logging
import os
from aiohttp import web
from core.utils.util import get_local_ip, get_project_dir
from manager.api.prompt import PromptHandler
logger = logging.getLogger(__name__)
async def handle_options(request):
headers = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Authorization'
}
return web.Response(headers=headers)
class ConfigServer:
def __init__(self, config: dict):
self.config = config
self.app = web.Application()
# 初始化接口处理器
self.prompt_handler = PromptHandler(config)
self.setup_routes()
def setup_routes(self):
# 注册prompt接口
self.app.router.add_get('/api/prompt', self.prompt_handler.get_prompt)
self.app.router.add_post('/api/prompt', self.prompt_handler.update_prompt)
self.app.router.add_options('/api/prompt', handle_options)
# 注册静态文件路由
static_dir = os.path.join(get_project_dir(), 'manager/static') # 获取static目录绝对路径
self.app.router.add_static(
prefix='/manager/', # 匹配前缀
path=static_dir, # 静态文件目录
name='static'
)
self.app.router.add_get('/manager', self.redirect_to_index)
async def redirect_to_index(self, _):
raise web.HTTPFound('/manager/')
async def start(self):
try:
http_config = self.config['manager']
if not http_config.get('enabled', False):
logger.info("HTTP server is disabled")
return
runner = web.AppRunner(self.app)
await runner.setup()
site = web.TCPSite(runner, http_config['ip'], http_config['port'])
await site.start()
logger.info(
f"Config HTTP server is running at http://{get_local_ip()}:{http_config['port']}/manager/index.html")
return runner # 返回runner以便后续清理
except Exception as e:
logger.error(f"Failed to start HTTP server: {e}")
raise