2017-08-17 7 views
2

私は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ブロックと呼ばれるように見えます。私の失敗は私の実装、フラスクの理解、ともに問題なのでしょうか?

+0

このエクステンションをチェックアウトしてください:https://github.com/kennethreitz/flask-sslify – AArias

答えて

1

実行時エラーを回避するために、要求エンドポイントがビュー機能の1つであるかどうかを確認できます。 return Noneは技術的にreturnに相当しますが、何もしなければ、Pythonの関数は自動的にNoneを返します。文字列 "http"はURL内の他の場所で発生する可能性があるため、 "http://"を "http://"でなく "https://"に置き換えてください。そしてrequest.is_secureはおそらく、X-Forwarded-Protoヘッダーを調べるよりも、要求が安全かどうかをチェックする良い方法でしょう。次のように試してみてください:

@app.before_request 
def force_https(): 
    if request.endpoint in app.view_functions and not request.is_secure: 
     return redirect(request.url.replace('http://', 'https://')) 

セキュリティで保護されていない要求をリダイレクトするための独自のデコレータを作成することもできます。たとえば、このスニペット:http://flask.pocoo.org/snippets/93/を参照してください。

+0

おかげで@darksky、これが私の正しい道のりです。これがBluemixに固有のものかどうかはわかりません。プロトコルはいつもhttpとして私のアプリに送られます。元のプロトコルは 'X-Forwarded-Proto'ヘッダーにあります。 'request.is_secure'は常にfalseです。私のために働く条件は、 'app.view_functionsとrequest.headers.get( 'X-Forwarded-Proto'、None)のrequest.endpoint == 'http':' – user2085050

関連する問題