在蓝图上注册路由会引发AttributeError:'function'对象没有属性'route'

Geo*_*tti 5 python flask

我在其中定义了一个蓝图app/settings/__init__.py,然后导入视图以注册它们.这引起了提升AttributeError: 'function' object has no attribute 'route'.为什么我会收到此错误,如何解决?

from flask import Blueprint

settings = Blueprint('settings', __name__, template_folder='templates')

from app.settings import views
Run Code Online (Sandbox Code Playgroud)
Traceback (most recent call last):
  File "E:/surfmi/run.py", line 1, in <module>
    from app import app
  File "E:\surfmi\app\__init__.py", line 34, in <module>
    from app.settings import settings
  File "E:\surfmi\app\settings\__init__.py", line 6, in <module>
    from app.settings import views
  File "E:\surfmi\app\settings\views.py", line 17, in <module>
    @settings.route('/general')
AttributeError: 'function' object has no attribute 'route'
Run Code Online (Sandbox Code Playgroud)

dav*_*ism 12

您的视图模块有一个名为"settings"的视图函数,它会在执行到达时隐藏名为"settings"的导入蓝图.

from app.settings import settings

# the name settings refers to the blueprint imported above
@settings.route('/a')
def this_works():
    ...

# the name settings refers to the blueprint imported above
@settings.route('/')
def settings():
    ...

# the name settings now refers to the function defined above
@settings.route('/b')
def this_fails():
    ...
Run Code Online (Sandbox Code Playgroud)

别名导入使用不会与视图函数名称冲突的其他名称.

from app.settings import settings as bp

@bp.route('/')
def settings():
    pass
Run Code Online (Sandbox Code Playgroud)


use*_*382 10

对我来说,当路线名称和功能名称相同时就会发生这种情况。这似乎是 Flask 中的一个错误。

@train.route('/train',methods=['GET'])
def train():
    pass
Run Code Online (Sandbox Code Playgroud)

我将其更改为:

@train.route('/train',methods=['GET'])
def something_else():
Run Code Online (Sandbox Code Playgroud)

Flask 那时很高兴。

  • @train 和 def train() 在此模块的命名空间中发生冲突。他们都是“火车” (4认同)