2011-12-23 111 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做它的名字意味着什么。