flask蓝图报错‘Blueprint‘ object has no attribute ‘xxx‘

在Python Flask应用中,由于蓝图(Blueprint)和模块同名导致了模拟(mocking)功能失效。错误源于尝试模拟导入路径下的函数时,产生了名称冲突,使得模拟操作错误地指向了蓝图对象而非实际函数。解决方法是避免使用相同名称为模块和蓝图,确保正确模拟功能的调用路径。
摘要由CSDN通过智能技术生成

可能是因为蓝图名字和要调用函数模块方法名相同

不要用相同的名字命名模块、目录和蓝图。

基本上我们的代码有这种结构。子树使其更简单。

-- webcompat
   |-- __init__.py
   |-- form.py
   |-- api
   |   |-- __init__.py
   |   |-- uploads.py
   |   |-- endpoints.py
   …
   |-- helpers.py
   |-- views.py

所以在webcompat/__init__.py

from webcompat.api.endpoints import api
app = Flask(__name__, static_url_path='')
app.register_blueprint(api)

webcompat/api/endpoints/__init__.py

from webcompat.helpers import cool_feature

api = Blueprint('api', __name__, url_prefix='/api')

@api.route('blah')
def somewhere(foo):
    """blablah"""
    yeah = cool_feature()

那么这里发生了什么? 模块和蓝图共享相同的名称。所以如果在测试中我们需要模拟cool_feature:

with patch('webcompat.api.endpoints.cool_feature') as mock_cool:

我们需要记住,在模拟时,我们不会模拟已定义的功能(也称为 webcompat.helpers.cool_feature),而是在其已导入的位置(又名 webcompat.api.endpoints.cool_feature)模拟。在这种情况下我们将无法模拟,因为会有名称冲突。错误将是:

E    AttributeError: 'Blueprint' object has no attribute 'endpoints'

因为命名的webcompat.api 蓝图没有属性endpoints,而模块webcompat.api 有一个。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值