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