从其他视图中调用具有已修改环境的视图

时间:2015-12-16 17:44:12

标签: python flask

我有一个Flask应用程序,它有两个蓝图,一个API和一个Web前端。我想从前端蓝图中调用API蓝图中的函数,但是使用不同的上下文,特别是我想要更改HTTP_ACCEPT环境变量,然后恢复原始请求以进一步处理。

当我使用ctx.push() / ctx.pop()xwith 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

我可以存储原始值并在使用内部上下文后恢复它,但这似乎是不必要的。为什么在弹出上下文后没有恢复环境?

1 个答案:

答案 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