2015-11-24 111 views
0

我正在編寫一個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

爲什麼不創建一個覆蓋webapp2 init或dispatch的BaseHandler。這樣你不需要(或忘記)裝飾器。

Docs init override and dispach override

我使用dispatch 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, ..): 

     ....