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が呼び出されるためです。そのため、コールバックで設定した Location もエスケープされることになります。

于 2014-01-07T04:41:17.143 に答える