基本 Jinja

PythonのFlaskでhttpからhttpsにリダイレクトする

最終更新日 2023.02.18

Python の Flask で http から https にリダイレクトする方法。

@app.before_request
def before_request():
    if not request.is_secure and app.env != 'development':
        url = request.url.replace('http://', 'https://', 1)
        code = 301
        return redirect(url, code=code)

上の例では Flask の関数を app という名前でデコレートしている。before_request という関数を作り、そこでリダイレクトを行う。かなめは request.is_secure という部分で、request は flask パッケージに最初から入っている。

このコードは下の記事を参考にした。

python flask redirect to https from http - Stack Overflow

https リダイレクトの補足

Flask アプリの多くは Nginx を使う。そのため https リダイレクトは Nginx かアプリで行う。

  • Nginx で https リダイレクト
  • Flask で https リダイレクト

ロードバランサーを使わないときは Nginx で行うパターンになる。例えば Amazon のロードバランサーは https 通信に対応しているが、ロードバランサーから各インスタンス(Webサーバー)の通信は http である。つまり Nginx を ssl に対応する必要はない。

しかし https リダイレクトにするには、各インスタンスの Nginx に Let's Encrypt を設定しなければいけない。そしてそれはロードバランサーのメリットを台なしにしている。

Amazon などのロードバランサーを使うときは、Flask 側で https リダイレクトするほうが妥当かもしれない。アプリ側で設定するのは気が引くかもしれないが、各インスタンスに Let's Encrypt をインストールするよりはましだと思う。