2011-12-23 166 views
0

我有一個名爲裝飾Python的Bottle.py裝飾混亂

def auth(check_func=validate_login): 
    def decorator(view): 
     def wrapper(*args, **kwargs): 
      auth = check_func() 
      if auth: 
       return view(*args, **kwargs) 
      return bottle.redirect('/login.html') 
     return wrapper 
    return decorator 

auth裝飾用這樣

@get('/') 
@view("someview") 
@auth() 
def handler(): 
    #myhandlercode 

「身份驗證」,所以auth裝飾調用view功能這使得我的模板在bottle.py中。 但現在我想返回json而不是呈現view。那麼我必須對auth裝飾器代碼做出什麼改變才能實現這一點?我很困惑如何從認證代碼中調用處理程序,而不是view

編輯1:Bottle允許你返回字典,它直接將它轉換成json。我不想使用視圖,我只想從我的處理程序返回json給用戶。所以我應該只刪除@view裝飾器?而我應該在auth裝飾器中調用什麼?

回答

2

瓶路徑裝飾器能夠應用裝飾器給你,而不會破壞自動json功能。

@get('/', apply=[auth]) 
def handler(): 
    ... 

如果你不想看,只是刪除您@view裝飾,瓶提手類型的字典擺好,將其轉換爲JSON的答案。

0

你從視圖中返回Json(或者說是一個Python字典),對不對?在這種情況下,你不必修改裝飾器中的任何東西。視圖返回的內容不會立即轉發給用戶的瀏覽器,而是首先通過瓶子處理,然後返回給用戶。當你從視圖中返回一個字典時,它將被視爲Json,當返回一個模板字符串時,它將被視爲Html。

1

我不相信它有權在json傾銷中使用auth shoehorning。

下面是使用裝飾

def validate(): 
    return True 

def auth(valid=validate): 
    def _auth(f): 
     def _auth_wrap(): 
      if not valid(): 
       raise Exception('redirect') 
      return f() 
     return _auth_wrap 
    return _auth 

def view(tmpl): 
    def _view(f): 
     def _view_wrap(): 
      return tmpl.format(f()) 
     return _view_wrap 
    return _view 

@view('Hello, {0}') 
@auth() 
def handler(): 
    return 'World' 

handler 
# outputs: __main__._view_wrap 
handler() 
# outputs: 'Hello, World' 

的純醇Python和也行

return tmpl.format(f()) 

f FUNC是__main__._auth_wrap其被調用驗證並返回執行處理程序的例子。

這樣你就可以在上面除了tmpl.format之外做別的事情來處理json的轉儲,例如調用一個單獨的方法並傳遞需要的信息,或者將shoehorning傳入視圖裝飾器,這兩種方法都會更合適。

所以要回答最後的問題好一點,如果你想動態地決定是否基於請求轉儲json和bottle.py的視圖func不支持這個,那麼你可以使一個視圖包裝類似到上面那個請求對象上的檢查或者你想用來確定json輸出的任何東西,然後在_view_wrap中調用bottle.py的視圖或者json.dumps f()

如果你想總是做一個func轉儲json,然後刪除視圖裝飾器,並創建一個類似於上面的視圖裝飾器的json裝飾器,這將會return json.dumps(f())

這裏的要點是保持auth做它的名字意味着什麼。