0

我有一个名为“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 装饰器中调用什么?

4

3 回答 3

3

瓶路线装饰器能够在不破坏自动 json 功能的情况下将装饰器应用于您。

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

如果您不想要视图,只需删除您的@view装饰器,Bottle 优雅地处理字典,将其转换为 JSON 答案。

于 2011-12-25T14:00:01.483 回答
1

我不相信在 json 倾销中进行身份验证是正确的。

这是一个使用装饰器的普通 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())

ffunc 是__main__._auth_wrap调用 validate 并返回执行的处理程序。

因此,您将通过执行上述 tmpl.format 之外的其他操作来处理转储 json,例如调用单独的方法并传递所需的信息,或者将其插入视图装饰器中,这两种方式都更合适。

因此,为了更好地回答最终问题,如果您想根据请求动态决定是否转储 json,并且 bottle.py 的 view func 不支持这一点,那么您可以制作一个类似于上面的视图包装器检查请求对象或您想用来确定 json 输出的任何内容,然后在 _view_wrap 中调用 bottle.py 的视图或f()json.dumps

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

这里的要点是让 auth 做它的名字所暗示的事情。

于 2011-12-23T21:56:01.480 回答
0

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

于 2011-12-23T21:46:19.940 回答