将响应 headers 添加到 Flask 网络应用

Add response headers to flask web app

我有一个使用 render_template 的烧瓶网络应用程序,因为 follows.I 需要在响应中添加一个 Content-Security-Policy 作为额外的 http 响应标头。我尝试了以下方法,但都失败并给我 500。

1.

from flask import \
Flask, \
render_template
app = Flask(__name__,template_folder='tmpl')
@app.route('/')
def index():
    resp =make_response(render_template('index.html'))
    resp.headers['Content-Security-Policy']='default-src \'self\'' 
    return resp

if __name__ == '__main__':
app.run(host='0.0.0.0', port=3001)

2.

@app.route('/')
def index():
    resp =render_template('index.html')
    resp.headers.add('Content-Security-Policy','default-src \'self\'') 
    return resp

if __name__ == '__main__':
app.run(host='0.0.0.0', port=3001)   

这里有什么问题吗?

当我以 localhost:3001

访问网络应用程序时,我在终端上看到以下内容

127.0.0.1 - - [06/Apr/2015 01:45:01] "GET / HTTP/1.1" 500 -

render_template returns 字符串,不是响应。 Flask 会自动将视图返回的字符串包装在响应中,这就是您可能会感到困惑的原因。使用呈现的模板构建响应。

from flask import make_response
r = make_response(render_template('index.html'))
r.headers.set('Content-Security-Policy', "default-src 'self'")
return r

处理这个问题的最漂亮的方法,假设你想要将相同的 headers 附加到你的所有响应中,那就是使用 flasks 内置装饰器:

@app.after_request

所以在这种情况下,只需将此功能添加到您的路线模块中即可:

@app.after_request
def add_security_headers(resp):
    resp.headers['Content-Security-Policy']='default-src \'self\''
    return resp

有了这个,你的函数就像以前一样 return render_template(...) 值,flask 会自动将它包装在一个响应中,然后传递给 after_request 函数在 return 发送给客户之前。