我有一个Flask应用程序,它有两个蓝图,一个API和一个Web前端。我想从前端蓝图中调用API蓝图中的函数,但是使用不同的上下文,特别是我想要更改HTTP_ACCEPT
环境变量,然后恢复原始请求以进一步处理。
当我使用ctx.push()
/ ctx.pop()x
或with app.request_context(request.environ)
时,环境变量不会更改回原始状态。
@dashboard_blueprint.route('/station', methods=['GET'])
def station():
station_id = request.args['id']
print(request.environ['HTTP_ACCEPT'])
# >>> text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
with app.request_context(request.environ) as ctx:
ctx.request.environ['HTTP_ACCEPT'] = 'application/vnd.geo+json'
# Call API function here.
print(request.environ['HTTP_ACCEPT'])
# >>> application/vnd.geo+json
...
我希望第二个print()
打印原始text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
,但它会从内部上下文打印application/vnd.geo+json
。
我可以存储原始值并在使用内部上下文后恢复它,但这似乎是不必要的。为什么在弹出上下文后没有恢复环境?
答案 0 :(得分:1)
Flask不会将您传递的数据复制到request_context
。如果您传递现有环境,则将使用(并修改)该环境。传递副本。
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def index():
print(request.environ['HTTP_ACCEPT'])
new_environ = request.environ.copy()
new_environ['HTTP_ACCEPT'] = 'test'
with app.request_context(new_environ):
print(request.environ['HTTP_ACCEPT'])
print(request.environ['HTTP_ACCEPT'])
return 'Hello, World!'
app.run()
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
test
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8