Python中如何为带SSL的WebSocket服务同事件循环添加HTTP服务
问题解答
结论
完全可以在当前的asyncio事件循环中额外运行HTTP服务,asyncio原生支持单个事件循环挂载多个独立的网络服务,你可以根据需求选择不同端口独立部署或者同端口路由复用两种方案。
方案1:不同端口独立部署(实现最简单,无路由冲突)
直接在现有事件循环中额外注册HTTP服务的协程即可,两个服务会共用同一个事件循环异步运行,互不干扰。推荐用aiohttp快速实现HTTP服务,示例代码如下:
# 安装依赖:pip install aiohttp from aiohttp import web # 定义HTTP接口处理逻辑 async def get_handler(request): return web.Response(text="GET 请求处理成功") async def post_handler(request): req_data = await request.json() # 若接收JSON格式POST,也可按需用request.post()接收表单数据 return web.json_response({"code": 0, "data": req_data}) # 初始化HTTP服务 http_app = web.Application() http_app.add_routes([ web.get("/api/get", get_handler), web.post("/api/post", post_handler) ]) # 将HTTP服务挂载到你已有的同一个事件循环中,放在原代码启动WebSocket服务之前执行即可 runner = web.AppRunner(http_app) await runner.setup() # 这里HTTP服务使用和WebSocket不同的端口即可,SSL配置可以复用你已生成的sslcontext,也可以不配置走HTTP明文 http_site = web.TCPSite(runner, "0.0.0.0", 8081, ssl=sslcontext) await http_site.start()
修改完后你的原有WebSocket服务不需要做任何调整,启动后两个服务会同时运行。
方案2:同端口路由复用(WebSocket和HTTP共用同一个端口)
如果有端口限制需要两个服务共用一个端口,可以在请求接入层做路由判断:如果请求头带WebSocket升级标识,就交给autobahn的WebSocket逻辑处理,其余请求走HTTP服务逻辑。你可以直接使用autobahn内置的HTTP处理能力实现,也可以自行实现一层请求分发中间件。
注意:该方案需要提前规划路径,避免WebSocket服务路径和HTTP接口路径出现冲突。
内容的提问来源于stack exchange,提问作者Zohar81
相关产品推荐
相关产品推荐

