如何实现可以输出替代响应的'before'钩子?

时间:2013-08-06 12:16:11

标签: python google-app-engine webapp2

在决定要显示的内容之前,需要进行一些身份验证检查。理想情况下,我希望有一个限制性的基本处理程序,它将实现可以显示替代内容的“之前”钩子,而不是请求的内容。

class Restrictive(webapp2.RequestHandler):
    def __init__(self, *args, **kwargs):
        if not self.is_logged_in():
            self.response.write('not logged in')
            self.abort(200)
    def is_logged_in(self):
         return False

但这不会输出响应,只会输出标题。中止请求的处理程序和显示替代内容的正确方法是什么?

感谢。

2 个答案:

答案 0 :(得分:4)

我曾经写过这个装饰师。

def authenticated(handler):
    """
        Decorator for checking if there's a user associated with the current session.
        Will also fail if there's no session present.
    """
    def check_login(self, *args, **kwargs):
        if not self.is_logged_in():
           self.response.write('not logged in')
           return self.error(403) 
        else:
           return handler(self, *args, **kwargs)
    return check_login

如果需要对方法进行身份验证,则可以对其进行修饰。

class MyHandler:
    @authenticated
    def get(self):
        pass

答案 1 :(得分:0)

有几种方法

一个是设置wsgi中间件 - 包装你的app,它可以在实际调用处理程序之前检查auth。 http://pythonweb.org/projects/webmodules/doc/0.5.3/html_multipage/lib/example-command-program-flow.html

在调用方法之前,可以在检查auth的方法上使用装饰器

任何一个选项都可以返回正确的状态,而你的实际处理程序不需要担心那种逻辑。