首页 > 解决方案 > 如何导入与其所在文件同名的蓝图?

问题描述

背景

我正在尝试设置一个名称与它所在的文件名匹配的蓝图,这样当我在我的文件中引用它时,我就app.py知道蓝图的来源。这应该是可能的,因为exploreflask上的示例使用了相同的模式。尽管如此,我还是无法弄清楚如何使用我的结构来完成这项工作。

文件结构

├── app.py
├── frontend
    ├── __init__.py
    └── views
        ├── home.py
        └── __init__.py

例子

前端/视图/home.py

from flask import Blueprint, render_template

home = Blueprint('home', __name__)
home1 = Blueprint('home1', __name__)

前端/视图/__init__.py

from .home import home
from .home import home1

应用程序.py

from flask import Flask

from frontend.views import home
from frontend.views import home1

print (type(home))  --> <class 'function'> 
print (type(home1)) --> <class 'flask.blueprints.Blueprint'>

Ashome1正确注册为 aBlueprinthome我不怀疑存在名称冲突,但我不知道如何解决它,尽管查看了 这篇关于导入约定的优秀文章。

因此,当我尝试使用应用程序注册我的蓝图时,这将起作用:

app.register_blueprint(home1, url_prefix='/home1') --> Fine

但这不会:

app.register_blueprint(home, url_prefix='/home')
--> AttributeError: 'function' object has no attribute 'name'

为什么不直接使用 home1 呢?

  1. 我想了解如何解决碰撞
  2. 我希望能够使用与它们所在的文件名相同的路由名称,如下所示:

前端/视图/home.py

from flask import Blueprint, render_template

home = Blueprint('home', __name__)

@home.route('/')
def home():
  pass

标签: pythonflaskpython-import

解决方案


我认为您的 views/__init__.py 文件导致了这个问题。它使 python 假设您的home.py文件是要导入的模块。我相信该行from frontend.views import home正在尝试导入home.py文件而不是您想要的home.home蓝图。

这是一个工作示例:

/app.py

from app import create_app
app = create_app()

if __name__ == '__main__':
    app.run()

/app/__init__.py

from flask import Flask

def create_app():
    app = Flask(__name__) 
    from .bp import bp  
    app.register_blueprint(bp)   
    return app

/app/bp/__init__.py

from flask import Blueprint
bp = Blueprint('bp', __name__, template_folder='templates')
from . import views

/app/bp/views.py

from app.bp import bp

@bp.route('/helloworld')
def helloworld():

    return "hello world"

推荐阅读