烧瓶中的蓝图

问题描述 投票:2回答:1

我正在接管具有用户模块但没有登录页面的Flask应用程序。该项目的结构是:

|-application.py
|-manage.py
|-settings.py
|-/templates
|----base.html
|----index.html
|----navbar.html
|----/user
|--------views.py

application.朋友:

from flask import Flask

....

def create_app(**config_overrides):
    app = Flask(__name__)
    app.config.from_pyfile('settings.py')

    app.config.update(config_overrides)

    db.init_app(app)

    from user.views import user_app
    app.register_blueprint(user_app)

    return app

用户/ views.py:

from flask import Blueprint, render_template, request, redirect, session, url_for, abort
...

user_app = Blueprint('user_app', __name__)

@user_app.route('login', methods = ('GET','POST'))
def login():
  ....

我将index.html放在templates文件夹中。

我应该将view.py放在我将路由到index.html的根目录中吗?

python python-3.x flask
1个回答
1
投票

您可以在任何地方添加其他路线。

但是,由于该软件包使用的是create_app() app工厂,因此您无法使用@app.route()装饰器注册这些路径;应用程序不是以您可以导入的方式创建的。

所以,是的,创建一个views.py模块是一个很好的组织理念,但也在那里创建一个Blueprint(),并在create_app()函数中使用Flask()应用实例注册该蓝图。

views.py

from flask import Blueprint

bp = Blueprint('main', __name__)

@main.route('/')
def index():
    # produce a landing page

并且在create_app()application.py,添加

import views
app.register_blueprint(views.bp)

(我使用了一个使用bp变量名称的惯例来表示我的所有蓝图,然后只导入模块并注册module.bp属性)。

这是明确的导入和app.register_blueprint()调用,它将Flask项目中使用的任何蓝图与最终应用程序的路径联系起来。蓝图可以共享相同的前缀,包括没有前缀。

有一点需要注意:这里的views模块现在是application.py旁边的顶级模块。如果将所有内容都移到包中会更好,这样您就可以更自由地使用您使用的名称。单个包中的所有模块都是命名空间的,与jsontime以及flask等其他顶级模块分开,因此当您想要为项目中的一个附加模块使用相同的名称时,不会发生冲突。

你将除了manage.py之外的所有内容移动到一个子目录中,并使用适合项目的名称,并将application.py移动到__init__.py。然后导入可以使用from . import ...从当前包中导入等。

© www.soinside.com 2019 - 2024. All rights reserved.