You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Bottle框架中使用登录验证装饰器后模板输出不显示的问题求助

Python Bottle框架中使用登录验证装饰器后模板输出不显示的问题求助

我来帮你分析下这个问题哈~

你遇到的页面空白问题,核心原因是装饰器的包装函数没有返回被装饰函数(以及错误处理函数)的返回值,导致Bottle框架无法接收到要渲染的模板内容,自然就显示空白了。

咱们来拆解下原装饰器的问题:

  1. 当verify_user()验证通过时,你只调用了fun()(也就是view_antigen()),但没有把它返回的模板内容传递出去;
  2. 当验证不通过时,同样只是调用了nothing(),没有返回它生成的failed_login.html模板;
  3. 另外,包装函数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 16:34:37