如果您使用的是 SimpleAuth,我假设您可能使用的是 webapp2,所以 @jmort253 的示例并不完全符合我的要求(例如 webapp2 具有内置会话,那么为什么还要使用另一个库来处理会话)。
不过,从概念上讲,它是正确的:您需要在开始身份验证过程之前将原始 URL 存储在会话中的某个位置。然后在成功验证后使用该存储的 URL 进行最终重定向。
从 SimpleAuth 的示例应用程序代码开始,您基本上需要更改 last line of _on_signin() 以将用户重定向到他们来自的原始 URL(而不是“/profile”)。
要存储原始请求 URL,您可以使用简单的包装器,例如
def simpleauth_login_required(handler_method):
"""A decorator to require that a user be logged in to access a handler.
To use it, decorate your get() method like this:
@simpleauth_login_required
def get(self):
user = self.current_user
self.response.out.write('Hello, ' + user.name())
"""
def check_login(self, *args, **kwargs):
if self.request.method != 'GET':
self.abort(400, detail='The login_required decorator '
'can only be used for GET requests.')
if self.logged_in:
handler_method(self, *args, **kwargs)
else:
self.session['original_url'] = self.request.url
self.redirect('/my-login-page-where-users-can-choose-auth-method')
return check_login
现在,回到那个 _on_signin() 重定向行,而不是 self.redirect('/profile') 你会做这样的事情:
target = self.session['original_url']
self.redirect(target)
几个注意事项:
- 上面的示例假设您有一个
logged_in 方法,该方法指示当前请求是否由已通过身份验证的用户发出;
- 您可能希望从会话中清除“original_url”(如果他们成功通过身份验证)
以上示例的学分转到webapp2_extras.appengine.users module。