Skip to main content
 首页 » 编程设计

python之flask-oauth 永远不会在 oauth 身份验证后重定向

2025年05月04日10Free-Thinker

我正在使用 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(...) 

该页面上有一个按钮可以转到与文档匹配的登录 View :

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

此 View 中涵盖了那里的回调:

@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 的 View ,因为我们设置了 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 - 

请注意,在 oauth-authorized 的 302 之后,“GET/”没有 200。不应该有吗?

请您参考如下方法:

原来这是一个简单的缓存问题。在用 @app.after_request 修饰的 add_header 方法中,我做了以下更改:

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

所以,现在浏览器知道每次都重新获取索引 View 。最终,对于更大规模的网站,我会改变这种模式,以便有效地使用缓存。