我正在构建我的第一个Flask应用程序,我无法找到一个好的,干净的Pythonic方式来组织我的应用程序。 我不希望在他们的示例中将所有内容都放在单个.py文件中。 我想将我的应用程序的每个部分都放在一个单独的模块中。 什么是组织事物的好方法?
答案 0 :(得分:82)
我创建了一个名为“Fbone”的Flask样板项目,请随时查看并分叉:)
Fbone(Flask bone)是一个Flask(Python微框架)模板/ bootstrap /样板文件应用程序。
概述
顺便说一句,我刚刚发现这个wiki用于构建一个有用Flask的大型项目,请查看它!
答案 1 :(得分:20)
Flask 0.7实现了Blueprints。它们非常适合在不导入主应用程序对象的情况下使用route
装饰器。
答案 2 :(得分:16)
请务必阅读 Matt Wright关于此主题的wonderful post。
帖子功能:
大型烧瓶项目结构的描述
关于大型网络应用的一般性最佳设计实践的描述,如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