如何在单独的文件中向蓝图添加视图

时间:2019-05-22 05:33:57

标签: python flask blueprint

我有一个庞大的应用程序,很难更新其视图。为了解决这个问题,我使用blueprints将视图分成了几个文件。问题在于,蓝图也变得越来越大,因为每个视图都有很长的文档以及每个视图所需的不同验证。

我曾经尝试过这样import

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应用程序中。

3 个答案:

答案 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:空白文件

输出:

blueprint example

运行应用程序:

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