私はPython Flaskを使用してIBMのBluemix用のアプリケーションを作成しています。インバウンドリクエストを強制的にhttpsにしたいこのコードは動作します:Flaskのbefore_request()でHTTPSを強制的に使用する
# We want to redirect the request to use https. X-Forwarded-Proto is only set in Bluemix runtime.
forwarded_protocol = request.headers.get('X-Forwarded-Proto', None)
if forwarded_protocol is not None:
if forwarded_protocol == 'http':
new_url = request.url.replace('http', 'https', 1)
return redirect(new_url)
私のルート定義のそれぞれに入れるのではなく、1か所で行いたいと思います。 Flaskのドキュメントに基づいて、私はbefore_request()
を使用することを望んでいると思います。
フラスコのドキュメントの状態:
関数は引数なしで呼び出されます。この関数がNone以外の値を返す場合は、ビューからの戻り値であるかのように処理され、さらに要求処理が停止されます。
これは、None
を返すと、リクエストのルートコードが処理されることを意味します。その私の実装や理解のいずれかがオフになっているのにそれは明らかだ
@app.before_request
def force_https():
# We want to redirect the request to use https. X-Forwarded-Proto is only set in Bluemix runtime.
try:
forwarded_protocol = request.headers.get('X-Forwarded-Proto', None)
if forwarded_protocol is not None:
if forwarded_protocol == 'http':
new_url = request.url.replace('http', 'https', 1)
return redirect(new_url)
else:
return None
else:
return None
except RuntimeError as e:
return None
:だから、私の実装は次のようになります。このメソッドをルートコードに実行した後も、私はコントロールをハンドオフできません。またbefore_request()
はFlaskが最初のリクエストの前に起動しているので、try/except
ブロックと呼ばれるように見えます。私の失敗は私の実装、フラスクの理解、ともに問題なのでしょうか?
このエクステンションをチェックアウトしてください:https://github.com/kennethreitz/flask-sslify – AArias