【问题标题】:How to organize a relatively large Flask application?如何组织一个比较大的 Flask 应用程序?
【发布时间】:2012-03-12 19:51:42
【问题描述】:

我正在构建我的第一个 Flask 应用程序,但我想不出一种好的、干净的 Pythonic 方式来组织我的应用程序。 我不想像他们的示例那样将所有内容都放在一个 .py 文件中。 我想将我的应用程序的每个部分放在一个单独的模块中。 什么是组织事物的好方法?

【问题讨论】:

  • 我很喜欢这里解释的布局:flask.pocoo.org/docs/patterns/packages
  • 他们正在使用我想避免的循环导入。
  • 没错,但如果你想使用 app.route 装饰器,我认为这是不可避免的。

标签: python flask


【解决方案1】:

我创建了一个名为“Fbone”的 Flask 样板项目,请随时查看并 fork :)

Fbone(Flask bone)是一个 Flask(Python 微框架)模板/引导程序/样板应用程序。

概览

  • 为使用蓝图的大型项目精心设计。
  • 与最热门的前端框架集成:jQuery / html5boilerplate / bootstrap。
  • 由著名的 SQLalchemy 提供支持。
  • 通过烧瓶登录实现棘手的“记住我”。
  • 通过 flask-wtform 处理 web 表单。
  • 使用烧瓶测试和鼻子进行单元测试。
  • 通过 fabric 和 mod_wsgi 轻松部署(包括示例)。
  • flask-babel 的 i18n

顺便说一句,我刚刚发现这个wiki 在使用 Flask 构建大型项目时很有用,请检查一下!

【讨论】:

  • 真的很喜欢这个。谢谢!
  • 在运行 'fab d' 之前,您需要使用 'source env/bin/activate' 激活虚拟环境
  • Foundation 会比 bootstrap 好,嗯?
  • @imwilsonxu 我不知道你把多个模型放在哪里。你会像 php 框架那样将模型放在不同的文件中吗?
  • (fbone)MacBook-Pro-de-Pyderman:flask-boilerplate Pyderman$ fab setup Warning: Command(s) not found: setup
【解决方案2】:

Flask 0.7 实现了Blueprints。它们非常适合在不导入主应用程序对象的情况下使用 route 装饰器。

【讨论】:

  • 蓝图与模块有何不同?
  • 从技术上讲,蓝图是蓝图类的一个实例。它们可以跨越一个或多个模块,或者多个蓝图可以共存于同一个模块中。找出一个蓝图的模块或包,找到它的templatesstatic 文件夹。
  • 我已将蓝图集成到我的烧瓶骨项目中,请参阅我的答案。
【解决方案3】:

请务必阅读 Matt Wright 关于该主题的wonderful post

帖子特点:

  1. 大型烧瓶项目的结构描述

  2. An example application on Github

  3. 关于大型 Web 应用程序的一般最佳设计实践描述,例如 MVC 模式、应用程序工厂、服务和数据迁移等等(恕我直言,最有趣的功能)。

【讨论】:

  • 一个很好的例子解释。
【解决方案4】:

我正在开发一个(按照我的标准)大型 Flask 项目(5000 行 Python 代码,而且只完成了一半)。客户希望项目是模块化的,所以我采用了这种方法:

我的文件夹结构如下:

├── __init__.py
├── modules.yml
├── config
├── controllers
│   └── ...
├── lib: Common functions I use often
│   └── ...
├── models
│   └── ...
├── static: All static files
│   ├── css
│   ├── img
│   └── js
└── templates: Jinja2 templates
    └── ...

modules.yml 中,我定义了我的模块,包括名称和 URL。这样,客户无需接触单个 Python 文件即可启用/禁用模块。另外,我根据模块列表生成菜单。按照惯例,每个模块在controllers/ 中都有它自己的Python 模块,它将从models/ 加载它的model。每个控制器都定义了一个Blueprint 存储为控制器的名称。例如。对于user 模块,我在controllers/user.py

# Module name is 'user', thus save Blueprint as 'user' variable
user = Blueprint('user', __name__)

@user.route('/user/')
def index():
    pass

这样,我可以读取我的__init__.py 中的modules.yml 并动态加载和注册所有启用的模块:

# Import modules
for module in modules:

    # Get module name from 'url' setting, exculde leading slash
    modname = module['url'][1:]

    try:
        # from project.controllers.<modname> import <modname>
        mod = __import__(
            'project.controllers.' + modname, None, None, modname
        )
    except Exception as e:
        # Log exceptions here
        # [...]

    mod = getattr(mod, modname)  # Get blueprint from module
    app.register_blueprint(mod, url_prefix=module['url'])

我希望这能给你一些启发:)

【讨论】:

  • 你把你的测试文件放在哪里?
  • 上述结构实际上是一个带有项目名称(project_name/)的子目录。还有一个tests/ 文件夹和一个scripts/ 文件夹(用于可执行脚本)。对于tests/,使用与答案中相同的结构会很聪明:tests/models/ 用于模型测试,tests/controllers/ 用于控制器测试,您可以命名。这将需要一些开销来维护结构,但会使查找所需文件变得非常简单。
【解决方案5】:

我在一个建立在 Flask 之上的社交网络上工作。我的项目的特别之处在于服务器纯粹为 API 端点提供服务,而前端是一个单页 Backbone 应用程序。我采用的Flask结构如下:

├── app │ ├── api
│ │ ├── auth.py │ │ └── ... │ ├── app.py │ ├── common │ │ ├── constants.py │ │ ├── helpers.py │ │ ├── response.py │ │ └── ... │ ├── config.py │ ├── extensions.py │ ├── frontend │ │ └── controllers.py │ ├── static │ │ └── ... │ ├── templates │ │ ├── app.html │ │ └── ... │ └── users │ ├── UserConstants.py │ ├── UserForms.py │ ├── UserHelpers.py │ ├── UserModels.py │ └── __init__.py ├── alembic | ├── version │ └── ... ├── tests │ └── ...

您可以阅读我写的关于主题here 的更深入的帖子。我发现将不同的功能区域分开到自己的文件夹中要直观得多。

前段时间我在编写代码并完全开源!您可以查看on github

【讨论】:

  • 谢谢。看起来不错。
【解决方案6】:

我从头开始创建了一个 Flask 应用程序 yapper 并将其与 gulp 集成以进行前端和后端开发。 它是一个简单的博客引擎,但可以根据需要轻松修改以进行开发。它使用蓝图结构良好。

查看项目页面yapper

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    相关资源
    最近更新 更多