首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >烧瓶中的蓝图

烧瓶中的蓝图
EN

Stack Overflow用户
提问于 2018-08-31 05:29:41
回答 1查看 1.8K关注 0票数 2

我接管了一个Flask应用程序,它有一个用户模块,但没有登录页面。该项目的结构如下:

代码语言:javascript
复制
|-application.py
|-manage.py
|-settings.py
|-/templates
|----base.html
|----index.html
|----navbar.html
|----/user
|--------views.py

application.py:

代码语言:javascript
复制
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

user/views.py:

代码语言:javascript
复制
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文件夹中。

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

EN

回答 1

Stack Overflow用户

发布于 2018-08-31 05:37:32

您可以随心所欲地添加其他路由。

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

因此,创建一个views.py模块是一个很好的组织想法,但也要在那里创建一个Blueprint(),并在create_app()函数中向Flask()应用程序实例注册该蓝图。

views.py

代码语言:javascript
复制
from flask import Blueprint

bp = Blueprint('main', __name__)

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

application.pycreate_app()中,添加

代码语言:javascript
复制
import views
app.register_blueprint(views.bp)

(我使用的惯例是对所有蓝图使用bp变量名,然后导入模块并注册module.bp属性)。

显式的导入和app.register_blueprint()调用将Flask项目中使用的任何蓝图绑定到最终应用程序的路由中。蓝图可以共享相同的前缀,包括没有前缀。

需要注意的一件事是:在这里,views模块现在是application.py旁边的顶级模块。如果把所有东西都移到一个包中,让你在使用名字时有更多的自由,那会更好。单个包中的所有模块都有命名空间,与其他顶级模块(如jsontimeflask )分开,因此当您想要为项目中的其他模块之一使用相同的名称时,不会发生冲突。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52105617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档