2011-01-05 94 views
0

我正在构建groupon-y服务来学习应用引擎。我想跟踪登录该网站的帐户列表(使用Google身份验证)。什么是最好的方法来做到这一点?由于我使用谷歌身份验证,因此没有单一时间点他们'注册';他们可以在任何网址登录。在appengine中登录track

这里是我试过:

  • 在那做了get_or_insert
  • 我想我可以继承@login_required每一个请求处理程序的开始force_login功能,但我仍然必须记住装饰我所有的请求处理程序

是不是有办法在登录后立即挂钩并注册一些逻辑?

回答

0

没有登录,但如你所说后立即执行代码,记得要做到在每一个处理程序的开始,或者在每个处理程序中一个装饰的方式。装饰者听起来像一个更好的选择。

1

你可以使用装饰器 - 你必须记得把它放在任何需要登录的处理器的前面 - 或者你可以在你的所有处理器扩展的基本RequestHandler中完成(我的个人偏好),或者你可以编写一些WSGI中间件。随你便。

0

你会如何写一个装饰?

有得 [RequiresAuthentication]在.NET MVC相似?

class Importer(webapp.RequestHandler): 
    @RequiresAuthentication 
    def get(self): 
     pass 



def RequiresAuthentication(fn): 
    def authorize(self): 
     if not users.get_current_user(): 
      self.redirect(users.create_login_url(self.request.uri)) 
     else: 
      return fn(self) 
    return authorize 

我刚才在测试应用程序中测试过,它似乎工作。

看着@login_required之后,它不适合岗位工作:

def 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: 

    @login_required 
    def get(self): 
     user = users.get_current_user(self) 
     self.response.out.write('Hello, ' + user.nickname()) 

    We will redirect to a login page if the user is not logged in. We always 
    redirect to the request URI, and Google Accounts only redirects back as a GET 
    request, so this should not be used for POSTs. 
    """ 
    def check_login(self, *args): 
    if self.request.method != 'GET': 
     raise webapp.Error('The check_login decorator can only be used for GET ' 
         'requests') 
    user = users.get_current_user() 
    if not user: 
     self.redirect(users.create_login_url(self.request.uri)) 
     return 
    else: 
     handler_method(self, *args) 
    return check_login 
+0

我没有读您的文章。我刚刚实施了@login_required – DerpDerp 2011-02-12 05:37:46