2012-12-29 36 views
2

我正在使用Flask-Oauth附加組件用於使用Twitter進行身份驗證。我基本上使用了文檔中的確切代碼,但重定向返回索引從未出現過。或者,如果發生這種情況,會出現一些奇怪的瀏覽器緩存。oauth身份驗證後重定向從未發生與flask-oauth

我的主頁基本上是這樣的:

@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 oauth-authorized後沒有200的 「GET /」。不應該有嗎?

+0

線程本地'g'對象不會在請求之間持續存在,除非您在'before_request'視圖或其他類似的位置引導它。如果你不這樣做,用戶對象不會被附加到'g'。但是,您說刷新時看到了正確的信息?所以我假設上述情況正在發生。但我仍然有點困惑,瀏覽器是否重定向?你應該看到索引的請求,是的。 – maxcountryman

回答

0

原來這是一個簡單的緩存問題。在我add_header方法裝飾有@app.after_request,我做了這個變化:

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

所以,現在的瀏覽器知道要重新讀取索引視圖每次。最終,在更大規模的網站上,我會改變這種模式,以便有效地使用緩存。