python - 如何导入与其所在文件同名的蓝图?
问题描述
背景
我正在尝试设置一个名称与它所在的文件名匹配的蓝图,这样当我在我的文件中引用它时,我就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
正确注册为 aBlueprint
但home
我不怀疑存在名称冲突,但我不知道如何解决它,尽管查看了
这篇关于导入约定的优秀文章。
因此,当我尝试使用应用程序注册我的蓝图时,这将起作用:
app.register_blueprint(home1, url_prefix='/home1') --> Fine
但这不会:
app.register_blueprint(home, url_prefix='/home')
--> AttributeError: 'function' object has no attribute 'name'
为什么不直接使用 home1 呢?
- 我想了解如何解决碰撞
- 我希望能够使用与它们所在的文件名相同的路由名称,如下所示:
前端/视图/home.py
from flask import Blueprint, render_template
home = Blueprint('home', __name__)
@home.route('/')
def home():
pass
解决方案
我认为您的 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"
推荐阅读
- powerbi - 在行为类似于 powerBI 中的列计算的度量中使用切片器值的解决方法
- php - SetupDatabase() Croogo 3.0.5 [已修复] 后出现错误 500
- c# - 在一个窗口中以两种不同的方式样式化 WPF 树
- php - Jquery,Ajax保存到数据库
- sql - 在表中创建 100 个连续整数的表的最简单方法?
- c# - 过滤功能在 ASP.NET MVC 中不起作用
- node.js - Nodejs Express 用于 Web 应用程序 JWT 与数据库或会话来验证用户
- javascript - Access-Control-Allow-Origin 仅适用于 chrome
- angular - 多个路由器插座,命名路由器插座不起作用
- c++ - 如果参数被传递两次,会发生什么情况?一次按值,一次按引用?会修改还是不修改?