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


74

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


4
我非常喜欢这里介绍的布局:flask.pocoo.org/docs/patterns/packages
obmarg 2012年

1
他们在那里使用循环进口,我想避免这种情况。
丹尼尔斯,2012年

是的,但是如果您要使用app.route装饰器,我认为这是不可避免的。
obmarg 2012年

Answers:


83

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

Fbone(烧瓶骨骼)是Flask(Python微框架)模板/引导程序/样板应用程序。

总览

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

顺便说一句,我刚刚发现这个用Flask构建大型项目的Wiki非常有用,请检查一下!


真的是这样 谢谢!
jdsantiagojr

在运行自述文件中详细介绍的'fab d'之前,您需要使用'source env / bin / activate'激活您的虚拟环境
JRG 2013年

1
基础会比自举更好,是吗?
rrrub 2014年

1
@imwilsonxu我不知道您将多个模型放在哪里。您是否像php框架一样将模型放在不同的文件中?
约翰尼,2015年

(fbone)MacBook Pro-de-Pyderman:烧瓶样板Pyderman $fab setup Warning: Command(s) not found: setup
Pyderman16年

20

Flask 0.7实现了蓝图。它们非常适合使用route装饰器而无需导入主应用程序对象。


1
蓝图与模块有何不同?
dcolish 2012年

1
从技术上讲,蓝图是Blueprint类的实例。它们可以跨越一个或多个模块,或者多个蓝图可以共存于同一模块中。幕后有一些魔术可以找出蓝图的模块或包,以找到其templatesstatic文件夹。
Alex Morega '02

1
我已经将蓝图集成到了烧瓶骨骼项目中,请参见我的回答。
imwilsonxu 2012年

17

请务必阅读Matt Wright关于该主题的精彩文章

该职位的特点:

  1. 大型烧瓶项目的结构说明

  2. Github上的示例应用程序

  3. 通常,它是针对大型Web应用程序的最佳设计实践的描述,例如MVC模式,应用程序工厂,服务和数据迁移等(最有趣的功能IMHO)。


一个很好的例子解释。
Nandesh

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文件。另外,我基于模块列表生成菜单。按照惯例每个模块都有它自己的Python的模块中controllers/,将其加载modelmodels/。每个控制器都将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'])

希望对您有所启发:)


您将测试文件放在哪里?
2014年

1
上述结构实际上是项目名称(project_name/)的子目录。还有一个tests/文件夹和一个scripts/文件夹(用于可执行脚本)。因为tests/最好使用与答案相同的结构:tests/models/对于模型测试,tests/controllers/对于控制器测试,请为其命名。这将需要一些维护结构的开销,但使查找所需文件变得非常简单。
msiemens 2014年

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 │ └── ...

您可以在这里阅读我写的关于该主题的更深入的文章。我发现将不同的功能区域分离到其自己的文件夹更加直观。

我前一段时间处理代码,并完全开源了!您可以在github上查看它。


谢谢。看起来不错。
丹尼尔斯,2013年

2

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

检出项目页面yapper

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.