我正在使用 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 。最终,对于更大规模的网站,我会改变这种模式,以便有效地使用缓存。
关于python - flask-oauth 永远不会在 oauth 身份验证后重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14078588/