我正在编写一个GAE应用程序(并使用webapp2框架和jinja2作为模板渲染器),我希望用装饰器包装所有的GET和POST方法。装饰器检查用户是否有权访问此页面,如果没有,则应显示错误消息。
问题在于,在装饰器内部,我无法使用 self.response.write 来显示错误消息,因为装饰器是一种方法,它不会''扩展''webapp2。 RequestHandler。
这是装饰器代码:
def checkpriv(classNo, errorMsg):
def wrapFunction(method):
if checkprivileges(classNo):
return method
else:
logging.info(users.get_current_user().nickname() + errorMsg)
# NEED TO DISPLAY ERROR MESSAGE HERE
return wrapFunction
我尝试创建一个扩展webapp2.RequestHandler并在装饰器内初始化它的对象的类,但是我得到了这个错误404 GET方法是不允许的。
答案 0 :(得分:0)
为什么不创建覆盖webapp2 init或dispatch的BaseHandler。这样你就不需要(或忘记)一个装饰者。
文档init override和dispach override。
我使用调度覆盖来创建基于角色的访问控制。
class BaseHandler(webapp2.RequestHandler):
""" webapp2 base handler """
def dispatch:
# abort or dispatch and pass an argument to the handler
self.request.route_kwargs['user_access'] = UserAccess(self.request)
super(BaseHandler, self).dispatch()
class YourHandler(BaseHandler):
def get(self, user_access, ..):
....