以下に示すFlaskを使用した非常に単純なpythonプログラムがあります。ポップアップとログアウトでログインを処理します。問題は、ブラウザーの URL が redirect(url_for()) 呼び出しによって更新されないことです。
@app.route('/')
def index():
if not 'username' in session:
# contains a button showing a login popup form with action set to '/login'
return render_template('welcome.html')
else:
# contains a logout button with a href to '/logout'
return render_template('webapp.html')
@app.route('/login', methods=['POST'])
def login():
session['username'] = request.form['username']
return redirect(url_for('index'))
@app.route('/logout')
def logout():
session.pop('username', None)
return redirect(url_for('index'))
「/」にアクセスすると、ようこそページが表示されます。ボタンをクリックすると、ログイン ポップアップが表示され、そのフォーム アクションが「/login」にリダイレクトされます。これは機能し、login() 関数が呼び出されて実行されます。リダイレクトも同様ですが、ブラウザは表示された URL を更新しません。
したがって、webapp ページは /logon url で表示されます。リロードをクリックすると、リダイレクトされた場所で「/」をリロードする必要があるときに /logon をリロードしようとするため、エラーが発生します。
/logout でも同じことが起こります。webapp ページが表示され、ログアウト ボタンをクリックすると、logout() 関数を実行してインデックスにリダイレクトする /logout ページが読み込まれます。しかし、URLはログアウトするために残されています。
次にページをリロードすると、/logout が GET メソッドを受け入れ、URL が / に更新されるため、最初の場所にあるはずだったので、成功します。
jQueryモバイルの問題であるという印象がありますが、問題を見つけることができません。Python と Flask の観点からは、私が見つけたすべてのログイン例と一致します。