2012-04-12 61 views
2

基本上我试图实现的是检查用户是否登录,如果他不是,他应该被重定向到/ somepage。我试图通过创建一个扩展webapp.RequestHandler的类来实现,稍后在代码中扩展该类。 (类似cakephp中的beforeFilter) 如果有什么不清楚的话我会解释它:)。如何在调用get()和post()之前做一些代码?

回答

1

使用装饰器。

这里的文档: http://www.python.org/dev/peps/pep-0318/

这里的例子删除请求路径上的斜线:

def removeslash(method): 
    """Use this decorator to remove trailing slashes from the request path. 

    For example, a request to '/foo/' would redirect to '/foo' with this 
    decorator. Your request handler mapping should use a regular expression 
    like r'/foo/*' in conjunction with using the decorator. 
    """ 
    @functools.wraps(method) 
    def wrapper(self, *args, **kwargs): 
     if self.request.path.endswith("/"): 
      if self.request.method == "GET": 
       uri = self.request.path.rstrip("/") 
       if self.request.query: uri += "?" + self.request.query 
       self.redirect(uri) 
       return 
      return self.status(404) 
     return method(self, *args, **kwargs) 
    return wrapper 

,你使用它像:

class MyHandler(RequestHandler): 
    @removeslash 
    def get(self): 
     # your code 
1

一种方法是实现一个类似于Django中用于用户身份验证的Python装饰器。例如login_required decorator。在stackoverflow上的This thread也是相关的。

2

您可以覆盖在Web应用程序请求dispatch()方法super()调用之前把这个检查:

http://webapp-improved.appspot.com/guide/handlers.html#overriding-dispatch

你也可以使用一个装饰,其他答案的建议,但这需要把它在每个处理程序的头部(您可能需要或可能不需要)。如上所述覆盖dispatch()可让您为所有页面执行一次。

如果您使用的是python2.5运行时,则需要在您的项目中安装webapp2并在代码中使用它。

+0

我也忘了提,我使用Python 2.5。 – Vizualni 2012-04-12 18:24:10

+0

已更新为python2.5。 – mjibson 2012-04-12 18:42:35

1

我做了什么是创建一个类层次结构,让我使用模板方法设计模式,如:

class Page(webapp.RequestHandler): 

    def do_get(self): 
     ''' override in derived classes to actually do something ''' 
     pass 

    def get(self): 
     ''' do NOT override this in derived classes ''' 
     # do whatever you need to do to verify that the get() should succeed. 
     # Maybe redirect, show an error, whatever 
     self.do_get() 

...因为你需要它是围绕着调用do_get()模板法功能的逻辑可以作为复杂,只要你处理类都是从这个类派生的,他们将得到正确的行为自动。

1

我还没有测试过,但这应该可以工作。只要您直接使用BasicHandler而不是webapp2,用户未登录的任何请求都会重定向。

class BasicHandler(webapp2.RequestHandler): 
    def __init__(self, request=None, response=None): 
     self.initialize(request, response) 
     self.user = users.get_current_user() 
     if not self.user: 
     self.redirect('/somepage') 

class Page(BasicHandler): 
    def get(self): 
     # Do your work/render... 

*编辑 把BasicHandler在自己的.py文件,并导入

相关问题