如何使用pygbag正确发起HTTPS请求并避免asyncio.run()错误?
解决pygbag发起HTTPS请求时的asyncio事件循环错误
问题根源
pygbag在浏览器环境下会自动启动并维护一个asyncio事件循环,你代码里用asyncio.run(main())会尝试创建新的事件循环,导致冲突,抛出RuntimeError: asyncio.run() cannot be called from a running event loop错误。另外,RequestHandler是pygbag专为Web环境适配的请求工具,本地直接运行需要做环境兼容处理。
解决方案
1. 区分运行环境
通过判断是否处于pygbag的Web环境,调整事件循环的使用方式:
- 在pygbag环境中:直接将异步任务提交到已有的事件循环
- 本地测试环境:使用
asyncio.run()或者获取现有循环添加任务
2. 修改后的代码
import asyncio import json from pygbag.support.cross.aio.fetch import RequestHandler BASE_URL = "https://your-api-domain.com" # 替换为你的实际API地址 async def send_request(data): handler = RequestHandler() try: response = await handler.post(f"{BASE_URL}/endpoint", data=data) if response: print("POST /endpoint: Success") response_data = json.loads(response) result = response_data.get('result') print("Result:", result) return result else: print("POST /endpoint: Failed") return None except Exception as e: print("Failed to post data:", e) return None # Example data data = {"key": "value"} async def main(): result = await send_request(data) if result: print("The computed result is:", result) else: print("No result could be retrieved.") # 根据环境选择启动方式 if __name__ == "__main__": try: # 尝试检测pygbag环境 import pygbag # 处于pygbag环境,提交任务到现有事件循环 loop = asyncio.get_event_loop() loop.create_task(main()) except ImportError: # 本地测试环境,使用asyncio.run启动 asyncio.run(main())
3. 额外注意事项
- 确保
BASE_URL配置正确,并且API支持CORS(pygbag运行在浏览器中,跨域请求需要服务器允许) - 本地测试时如果仍遇事件循环问题(比如交互式环境),可改用以下启动方式:
loop = asyncio.get_event_loop() loop.run_until_complete(main()) RequestHandler的post方法会自动适配Web环境,无需手动处理HTTPS细节,pygbag会在浏览器中调用原生Fetch API完成请求。
内容的提问来源于stack exchange,提问作者Nathanb96
相关产品推荐
相关产品推荐

