2

Flask の Flask-Oauth アドオンを使用して Twitter で認証しています。基本的にドキュメントの正確なコードを使用していますが、インデックスに戻るためのリダイレクトは発生していないようです。または、それが発生している場合は、奇妙なブラウザ キャッシングが行われています。

私のホームページは基本的に次のようになります。

@app.route('/', methods=['GET'])
def home():
    form = SadForm()
    if not g.user:
        needs_login = True
    else:
        # get some user stuff to display

    return render_template(...)

そのページには、ドキュメントに一致するログイン ビューに移動するボタンがあります。

@app.route('/login')
def login():
    return twitter.authorize(callback=url_for('oauth_authorized',
        next=request.args.get('next') or request.referrer or None))

そこにあるコールバックは、次のビューでカバーされています。

@app.route('/oauth-authorized')
@twitter.authorized_handler
def oauth_authorized(response):
    next_url = request.args.get('next') or url_for('home')
    if response is None:
        flash(u'You denied the request to sign in.')
        return redirect(next_url)

    session['user_id'] = response['screen_name']
    current_user = g.db.users.find_one({'user_id': response['screen_name']})
    if current_user:
        user = current_user
    else:
        user = {}
    user['user_id'] = response['screen_name']
    user['twitter_token'] = response['oauth_token']
    user['twitter_secret'] = response['oauth_token_secret']
    g.user = user.copy()
    g.db.users.save(user)
    flash('You were signed in.')
    return redirect(next_url)

ユーザーのコンテンツが表示されるようにhome設定したため、このメソッドの最後のリダイレクトはビューを「更新」する必要があるようです。g.userただし、実際には、ホームページは誰もログインしていないと見なしますが、ブラウザ ボタンを使用してページを更新すると、ログインしていることを認識して正しいデータを表示します。

サーバーのログは次のようになります。

21:39:36     INFO werkzeug - 127.0.0.1 - - [28/Dec/2012 21:39:36] "GET / HTTP/1.1" 200 -
21:39:45     INFO werkzeug - 127.0.0.1 - - [28/Dec/2012 21:39:45] "GET /login HTTP/1.1" 302 -
21:39:47     INFO werkzeug - 127.0.0.1 - - [28/Dec/2012 21:39:47] "GET /oauth-authorized?oauth_token=nope&oauth_verifier=beep HTTP/1.1" 302 -

の 302 の後に "GET /" の 200 がないことに注意してくださいoauth-authorized。あっていいんじゃない?

4

1 に答える 1

0

これは単純なキャッシングの問題であることが判明しました。add_headerで飾られた私のメソッドでは@app.after_request、次の変更を行いました。

- response.headers['Cache-Control'] = 'public, max-age=600' 
+ response.headers['Cache-Control'] = 'public, max-age=0'

これで、ブラウザーは毎回 index ビューを再フェッチすることを認識します。最終的に、大規模なサイトでは、このパターンを変更して、キャッシュを効果的に使用できるようにします。

于 2013-05-30T20:17:01.617 に答える