【问题标题】:Add response headers to flask web app将响应标头添加到烧瓶 Web 应用程序
【发布时间】:2015-06-10 10:30:15
【问题描述】:

我有一个使用 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 身份访问 Web 应用程序时,我在终端上看到以下内容

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

【问题讨论】:

    标签: python web flask header


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案2】:

      假设您希望将相同的标题附加到所有响应中,最漂亮的处理方法是使用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 函数。

      【讨论】:

      • 在蓝图上,我必须使用 @blueprint.after_app_request 才能正常工作
      猜你喜欢
      • 2018-10-01
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      • 2014-11-13
      相关资源
      最近更新 更多