Python Bottle.py装饰混淆

时间:2011-12-23 18:56:32

标签: python decorator bottle

我有一个名为“auth”的装饰者

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允许你返回dict,它直接将它转换为json。我根本不想使用视图,我只想从我的处理程序返回给用户json。那么我应该删除@view装饰器吗?我应该在auth装饰器中调用什么?

3 个答案:

答案 0 :(得分:2)

瓶子路径装饰器能够在不破坏自动json功能的情况下为你应用装饰器。

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

如果您不想要视图,只需移除您的@view装饰器,优雅地使用Bottle句柄,将其转换为JSON答案。

答案 1 :(得分:1)

我不相信在json倾销中拥有auth shoehorning的权利。

这是一个使用装饰器的简单ol python的例子

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'

以及

return tmpl.format(f())

f func是__main__._auth_wrap,它调用validate并返回执行的处理程序。

所以你可以通过在上面的tmpl.format之外做一些其他操作来处理转储json,例如调用一个单独的方法并传递所需的信息,或者将shoehorning转换为视图装饰器,这两种方式都更合适。

所以要更好地回答最终问题,如果你想根据请求动态决定是否转储json并且bottle.py的视图func不支持这个,那么你可以创建一个类似于上面对请求对象或你想用来确定json输出的任何东西进行检查,然后在_view_wrap中调用bottle.py的视图或f()上的json.dumps

如果你想让一个func总是转储json,那么删除视图装饰器并创建一个类似于上面的视图装饰器的json装饰器return json.dumps(f())

这里的要点是让auth按照它的名字暗示。

答案 2 :(得分:0)

您正在从视图中返回Json(或者更确切地说是python字典),对吧?在这种情况下,您不必更改装饰器中的任何内容。视图返回的内容不会立即转发到用户的浏览器,它首先由瓶子处理然后返回给用户。当您从视图中返回字典时,它被视为Json,当返回模板字符串时,它被视为Html。