2015-12-16 61 views
1

我有一個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

我可以存儲原始值並在使用內部上下文後恢復它,但似乎沒有必要。爲什麼上下文彈出後環境不會恢復?

+0

編輯的清晰度。它看起來像Flask不會做環境字典的副本,這不是我所期望的。 – MerseyViking

+0

我想。複製字典是我期望request_context()函數執行的操作。但如果沒有,那麼我將不得不自己做。不是問題,只是看起來不正確。 – MerseyViking

回答

1

燒瓶不會複製您傳遞給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