Python Bottle框架中使用登录验证装饰器后模板输出不显示的问题求助
Python Bottle框架中使用登录验证装饰器后模板输出不显示的问题求助
我来帮你分析下这个问题哈~
你遇到的页面空白问题,核心原因是装饰器的包装函数没有返回被装饰函数(以及错误处理函数)的返回值,导致Bottle框架无法接收到要渲染的模板内容,自然就显示空白了。
咱们来拆解下原装饰器的问题:
- 当
verify_user()验证通过时,你只调用了fun()(也就是view_antigen()),但没有把它返回的模板内容传递出去; - 当验证不通过时,同样只是调用了
nothing(),没有返回它生成的failed_login.html模板; - 另外,包装函数
do_it没有处理可变参数,虽然当前view_antigen没有参数,但为了装饰器的通用性,最好支持接收任意参数,避免后续其他带参数的路由函数出问题。
下面是修正后的装饰器代码:
from functools import wraps import logging def decorate_verify_user(fun): def nothing(): logging.debug("no username password available") return template("failed_login.html", post_data="No post_data") @wraps(fun) def do_it(*args, **kwargs): # 支持接收任意参数,适配不同路由函数 if verify_user(): # 简化掉冗余的==True判断 return fun(*args, **kwargs) # 返回被装饰函数的执行结果,让Bottle能拿到模板 else: return nothing() # 返回错误页面的模板内容 logging.debug("function name of do_it is {}".format(do_it.__name__)) return do_it
关键修改点说明:
- 在
do_it函数中,调用fun()和nothing()时都加上了return,这样Bottle就能拿到对应的模板返回值并渲染页面; - 给
do_it加上*args, **kwargs参数,让装饰器能适配需要接收请求参数的路由函数(比如带URL路径参数的路由); - 简化了
if(verify_user()==True)的写法,直接用if verify_user()更简洁规范。
修改后再测试,不管验证通过还是不通过,Bottle都能正确接收到模板内容,页面就能正常显示啦~
备注:内容来源于stack exchange,提问作者ShaileshKumarMPatel
相关产品推荐
相关产品推荐

