Flask 2.0 async访问get_features POST接口报Working outside of request context错误
错误原因
这个报错是因为你在没有激活请求上下文的环境下尝试访问Flask的request对象:
- Flask 分为应用上下文和请求上下文两类上下文,
request、session等变量属于请求上下文范畴,只有请求上下文处于激活状态时才能正常访问。 - 你代码中手动添加的
with app.app_context()仅会激活应用上下文,不会携带当前请求的上下文信息。 - 被
route装饰器修饰的路由函数默认进入时就已经自动激活了对应的请求上下文,你额外套的应用上下文块反而隔断了原有请求上下文,导致块内无法访问request对象。
解决方案
- 直接删除多余的
with app.app_context()包裹逻辑即可,修正后的代码如下:
@api_v1.route('/get_features', methods=['POST']) async def get_features(): results = [] inputs = request.json responses = await get_features_for_all(inputs) for response in responses: results.append(response) return jsonify({'result': results})
- 如果你确实有场景需要在独立异步任务、脱离路由函数的其他位置访问请求相关变量,不要用应用上下文,而是用
copy_current_request_context装饰器传递当前请求上下文,示例如下:
from flask import copy_current_request_context @api_v1.route('/get_features', methods=['POST']) async def get_features(): @copy_current_request_context async def inner_task(): inputs = request.json return await get_features_for_all(inputs) responses = await inner_task() return jsonify({'result': responses})
内容的提问来源于stack exchange,提问作者kartik
相关产品推荐
相关产品推荐

