向flask web app添加响应头

2024-05-19 12:24:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个flask web应用程序,它使用render_模板,如下所示。我需要在响应中添加一个内容安全策略作为额外的http响应头。我试着按以下方法做,但都失败了,给了我500英镑。

一。

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)   

这里有什么问题吗?

在终端上,当我以本地主机的身份访问web应用时,我看到了以下内容:3001

127.0.0.1--[2015年4月6日01:45:01]“获取/HTTP/1.1”500-


Tags: namewebappflaskindexdefhtmltemplate
2条回答

处理此问题最漂亮的方法是使用烧瓶内置装饰器,假设您希望将相同的标题附加到所有响应:

@app.after_request

因此,在本例中,只需将此函数添加到routes模块:

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

这样一来,您的函数就可以像以前一样返回render_template(…)值,flask会自动将其包装在一个响应中,该响应在返回给客户机之前传递给after_request函数。

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

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

相关问题 更多 >