Django异步视图中Ajax调用为何未等待async代码执行就立即返回结果
Django异步视图未等待异步逻辑执行完成问题解决方案
可能的原因及对应解决方法
- 运行环境不符合异步视图要求
Django 3.1及以上版本才支持原生异步视图,且异步视图必须运行在ASGI服务器下才能正常执行异步等待逻辑。如果使用默认的python manage.py runserver(WSGI模式)、Gunicorn同步worker等WSGI环境,Django会自动将异步视图包装为同步调用,事件循环适配异常会导致await逻辑没有被正确等待,直接跳过执行。
解决方法:
- 确认Django版本≥3.1
- 安装ASGI服务器:
pip install uvicorn - 用ASGI模式启动服务:
uvicorn 你的项目名.asgi:application
- 异步逻辑提前抛出异常,未走到等待步骤
你当前代码的buy_stock方法中,仅捕获了TinkoffInvestmentsError异常并打印,没有返回内容也没有向上抛出,一旦调用create_market_order接口时触发异常,函数会直接返回None,不会执行后续的await asyncio.sleep(5)逻辑,看起来就像立刻返回了结果。
解决方法:
完善异常捕获逻辑,增加错误返回便于排查,修改后的异常块参考:
except TinkoffInvestmentsError as e: print(f"接口调用出错:{e}") return f"操作失败:{str(e)}"
接口返回后查看message字段内容,即可确认是否是接口调用异常导致提前返回。
快速排查测试方案
你可以先屏蔽掉所有股票接口调用逻辑,只保留等待和返回,验证环境是否正常:
async def buy_stock(): await asyncio.sleep(5) return "测试完成"
如果修改后请求确实等待5秒再返回,说明运行环境正常,问题出在股票接口调用逻辑;如果还是立刻返回,说明运行环境配置错误,优先检查ASGI启动配置。
内容的提问来源于stack exchange,提问作者catsaredoomed
相关产品推荐
相关产品推荐

