如何组织一个相对较大的Flask应用程序?

时间:2012-02-22 13:18:18

标签: python flask

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

6 个答案:

答案 0 :(得分:82)

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

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

概述

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

顺便说一句,我刚刚发现这个wiki用于构建一个有用Flask的大型项目,请查看它!

答案 1 :(得分:20)

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

答案 2 :(得分:16)

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

帖子功能:

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

  2. An example application on Github

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

答案 3 :(得分:12)

我正在研究(根据我的标准)大型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模块,它将从model加载models/。每个控制器都定义一个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

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

# 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'])

我希望,这可以为你带来一些灵感:)

答案 4 :(得分:3)

我在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

答案 5 :(得分:2)

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

查看项目页面yapper