2

基本上我想要实现的是检查用户是否登录,如果他没有登录,他将被重定向到/somepage。我试图通过创建一个扩展 webapp.RequestHandler 的类来实现它,然后在代码中扩展该类。(类似于 cakephp 中的 beforeFilter)如果不清楚,我会解释它:)。

4

5 回答 5

2

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

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

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

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

于 2012-04-12T18:02:02.960 回答
1

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

于 2012-04-12T18:00:07.620 回答
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
于 2012-04-12T18:04:05.207 回答
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()模板方法函数的逻辑可以根据您的需要复杂,只要您的处理程序类都是从此类派生的,它们就会自动获得正确的行为。

于 2012-04-12T18:30:30.853 回答
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...

*edit 将 BasicHandler 放在它自己的 .py 文件中并导入

于 2012-04-12T19:26:29.887 回答