我有一个使用render_template的烧瓶网络应用程序,如下所示。我需要在响应中添加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 -
答案 0 :(得分:18)
render_template
返回一个字符串,而不是一个响应。从视图返回的字符串会自动包含在Flask的响应中,这就是您可能会感到困惑的原因。使用呈现的模板构造响应。
from flask import make_response
r = make_response(render_template('index.html'))
r.headers.set('Content-Security-Policy', "default-src 'self'")
return r
答案 1 :(得分:0)
处理此问题的最漂亮方法是,假设要对所有响应附加相同的标头,则使用flasks内置装饰器:
@app.after_request
因此,在这种情况下,只需将此功能添加到您的路由模块即可:
@app.after_request
def add_security_headers(resp):
resp.headers['Content-Security-Policy']='default-src \'self\''
return resp
使用此功能,您的函数只需像以前一样返回render_template(...)值,并且flask自动将其包装在响应中,然后将其传递给after_request函数,然后再返回给客户端。