如何将视图添加到单独文件中的蓝图

How to add views to a blueprint in separate files

我有一个越来越难以更新其视图的大型应用程序。为了 'fix' 这个,我使用 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 应用程序中。

在根文件夹中更改主文件:

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

Post 请求 O/P:

Welcome username

您需要导入 blueprint 文件中的 views 内容。

我已经创建了场景并且能够获得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

参考:

未发现视图模块,因为只导入了蓝图对象。

从您的蓝图组织,尤其是您在主文件中共享的导入,我可以推断出蓝图文件夹中存在 __init__.py导出蓝图对象。

导入该文件中的视图应该会让应用发现在蓝图中注册的视图。

blueprint/__init__.py:

from .test import test
from . import views