如何在调用get()和post()之前执行一些代码?

时间:2012-04-12 17:56:32

标签: python google-app-engine

基本上我想要实现的是检查用户是否已登录,如果不是,则应将其重定向到/ somepage。我试图通过创建一个扩展webapp.RequestHandler的类来实现它,稍后在代码中扩展该类。 (像cakephp中的beforeFilter) 如果事情不明确,我会解释它:)。

5 个答案:

答案 0 :(得分:2)

您可以覆盖webapp请求中的dispatch()方法,以便在super()调用之前进行此检查:

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分: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

答案 3 :(得分: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()模板方法函数的逻辑可能就像你需要的那样复杂,并且只要你的处理程序类都是从这个类派生的,它们就会得到自动纠正行为。

答案 4 :(得分: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文件中并导入