0

我正在尝试使用 Flask 重定向到 Graphite URL。我正在构建的石墨 URL 很复杂,必须包含文字字符 {、} 和 |。Flask 正在将它们转义到 %7B %7C 和 %7D。

有什么办法可以阻止这种情况吗?在石墨方面,我想要一个看起来像这样的目标: sumSeries({metric|metric|metric})

@app.route("/")
def index():
  instances = get_data()
  url = build_graphite_url(instances)
  print url
  return redirect(url)
4

1 回答 1

2

如果您深入研究 Flask 源代码,您最终会在 werkzeug 下的 wrappers.py 中遇到一个名为get_wsgi_headers的函数:请参见此处

这个函数在最终响应被创建并返回时被调用,如果你向下滚动一点,你会发现它会检查是否设置了位置标头,如果是,则进行一些自动更正以确保 url 是绝对的。在这期间,它需要对 url 进行转义,这就是你的 URL 被转义的原因。

据我所知,防止这种情况的唯一方法是修补get_wsgi_headers使其基本上不会转义某些字符,因为毕竟 Flask 是开源的 :)

另外作为旁注,您无法侦听after_request回调并修改响应标头的原因是因为 werkzeug 的get_wsgi_headers在回调之后被调用,因此您在回调中设置的任何位置最终也会被转义。

于 2014-01-07T04:41:17.143 回答