我有一个庞大的应用程序,很难更新其视图。为了解决这个问题,我使用blueprints将视图分成了几个文件。问题在于,蓝图也变得越来越大,因为每个视图都有很长的文档以及每个视图所需的不同验证。
我曾经尝试过这样import
:
在这里,我有一个包含Flask应用程序的主文件(导入蓝图),一个包含蓝图的文件,一个文件导入蓝图并在其中配置视图。问题在于,由于流程原因,这种方法无法呈现视图。
主文件,位于文件夹的根目录中:
from flask import Flask
from source import test
application = Flask(__name__)
application.register_blueprint(test)
application.run()
蓝图文件,位于根文件夹的子文件夹中:
from flask import Blueprint
test = Blueprint('test', __name__)
视图文件,位于与蓝图文件相同的子文件夹中:
from .test import test
@test.route('/home', methods=['GET', 'POST'])
def home():
return 'home'
我还尝试过将蓝图装饰器添加到已声明的函数中,这种方式会将视图添加到蓝图文件中的蓝图中,但是我认为这不是一个好的方法或可扩展的方法,但是它没有不起作用^-^。
我希望在文件中创建一个蓝图,在其他文件中导入该蓝图,然后将视图添加到该蓝图中,然后导入该蓝图并将其添加到Flask应用程序中。
答案 0 :(得分:1)
尝试一下:
在根文件夹中更改主文件:
from flask import Flask
from source.listener import test
application = Flask(__name__)
application.register_blueprint(test)
application.run()
蓝图文件,位于根文件夹的子文件夹中:
listener.py
from flask import Blueprint
from source.view import home
test = Blueprint('test', __name__)
test.add_url_rule('/home', view_func=home,methods=['GET', 'POST'])
视图文件,位于与蓝图文件相同的子文件夹中:
from flask import request
def home():
if request.method == 'POST':
user = request.form['name']
return "Welcome "+user
else:
return 'home'
获取请求O / P:
Home
发布请求O / P:
Welcome username
答案 1 :(得分:1)
您需要将views
内容导入blueprint
文件中。
我已经创建了方案并能够获得view
。此外,我更新了命名约定。
文件夹结构:
.
├── app.py
└── blueprints
├── example_blueprint.py
├── example_views.py
└── __init__.py
app.py
:
from flask import Flask
from blueprints.example_blueprint import bp
app = Flask(__name__)
app.register_blueprint(bp)
blueprints/example_blueprint.py
:
from flask import Blueprint
bp = Blueprint('bp', __name__,
template_folder='templates')
from .example_views import *
blueprints/example_views.py
:
from .example_blueprint import bp
@bp.route('/home', methods=['GET', 'POST'])
def home():
return 'home'
blueprints/__init__.py
:空白文件
输出:
运行应用程序:
export FLASK_APP=app.py
export FLASK_ENV=development
flask run
requirements.txt
:
Click==7.0
Flask==1.0.3
itsdangerous==1.1.0
Jinja2==2.10.1
MarkupSafe==1.1.1
pkg-resources==0.0.0
Werkzeug==0.15.4
参考:
答案 2 :(得分:1)
由于仅导入了Blueprint对象,因此未发现视图模块。
根据蓝图的组织结构,尤其是在主文件中共享的导入,我可以推断出导出蓝图对象的蓝图文件夹中是否存在 __ init __。py 。 / p>
在该文件中导入视图应该使应用程序发现在蓝图中注册的视图。 即
blueprint/__init__.py
:
from .test import test
from . import views