9

以下に示す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 の観点からは、私が見つけたすべてのログイン例と一致します。

4

1 に答える 1

10

質問を書き終えた後、最終的に解決しました。

この問題は、jQuery モバイルと欠落している data-url 属性によって引き起こされます。

ページ div に data-url 属性を追加すると、ブラウザの URL が更新され、すべて正常に動作します。

<div data-role="page" id="welcome" data-url="{{ url_for('index') }}">
于 2012-12-13T20:45:48.963 に答える