Flaskでアプリケーションを作っていて、ちょっとはまったのでメモ。
複数のFlaskアプリケーション
Flask でセッションを使うには、
app = Flask(__name__)
app.config['SECRET_KEY'] = b'適当なキー文字列'
と設定するのは周知の通り。
たとえば、Flask のアプリケーションを2つ稼働しているとして、
どちらもセッション情報を使う(たとえばログイン情報を保持しておくとか)場合。
同じブラウザの別タグで、それぞれのアプリケーションを開いて、タブを切り替えたりしていると、片方のセッションが消えてしまう現象が発生する。
FlaskはCookie にセッション情報を保存するが、デフォルトだと、"session" という名前になる。
アプリケーション1つなら問題ないが、2つの場合、同じ"session" という名前でCookie に書き込まれるので、後から開いた方のセッション情報で、前の情報が上書きされてしまうことになる。
これを回避するためには、cookie に保存するときの名前を設定する。
app.config['SESSION_COOKIE_NAME'] = 'hogehogeApp01_Cookie_name'
もちろん、それぞれのアプリケーションで名前は変えておく。
設定した名前でCookie が保存されるので、上書きされることがなくなる。
iPhone 対応
本番稼働直前の最後のテストで、iPhone で試していて発覚した問題。
FlaskがSession情報をCookieに保存するのは前述の通りだが、デフォルトだとiPhone にはCookieが保存されなかった。
どうやらiPhoneではサードパーティクッキーとして認識されると、そのCookie をさくっと削除してしまうらしい。
いろいろ試した結果、
app.config['SESSION_COOKIE_SECURE'] = True
app.config['SESSION_COOKIE_SAMESITE'] = 'None'
この2つを追加したところ、iPhoneにもCookie が保存されるようになった。
ちなみに、
app.config['SESSION_COOKIE_SAMESITE'] = None
ではなく、
app.config['SESSION_COOKIE_SAMESITE'] = 'None'
と文字列で設定しないとNG。