一.使用工厂函数创建程序实例
工厂(factory)是指创建其他对象的对象,通常是一个返回其他类的对象的函数或方法。程序实例在工厂函数中创建,这个函数返回程序实例app。按照惯例,这个函数被命名为create_app()或make_app()。我们把这个工厂函数称为程序工厂(Application Factory)——即“生产程序的工厂”,使用它可以在任何地方创建程序实例。
工厂函数提供了很大的灵活性。另外,借助工厂函数,我们还可以分离扩展的初始化操作。==在这个工厂函数中,我们会创建程序实例,为其加载配置,注册蓝本,执行扩展的初始化操作.最后返回程序实例==。
约定俗成:
项目根目录中(app.py同级)创建工厂文件factory.py
1 | csharp复制代码from flask import Flask |
此时app.py调用create_app()获取程序实例app
1 | python复制代码from factory import create_app |
二.使用类组织配置文件
在实际需求中,我们往往需要不同的配置组合。例如,开发用的配置,测试用的配置,生产环境用的配置.我们可以在单个配置文件中使用Python类来组织多个不同类别的配置。
约定俗成:
项目根目录中(app.py同级)创建配置文件settings.py
1 | ruby复制代码# @FileName: settings |
在配置文件的底部,我们创建了一个存储配置名称和对应配置类的字典config,用于在创建程序实例时通过配置名称来获取对应的配置类
工厂函数中加载配置
在创建程序实例后使用app.config.from_object()方法加载配置,传入配置类:
1 | csharp复制代码//factory.py |
三.扩展类实例化和初始化分离
为了完成扩展的初始化操作,我们需要在实例化扩展类时传入程序实例。但使用工厂函数时,并没有一个创建好的程序实例可以导入。如果我们把实例化操作放到工厂函数中,那么我们就没有一个全局的扩展对象可以使用,比如表示数据库的db对象。
为了解决这个问题,大部分扩展都提供了一个
init_app()
方法来支持分离扩展的实例化和初始化操作。现在我们仍然像往常一样初始化扩展类,但是并不传入程序实例.这时扩展类实例化的工作可以抽离出来
约定俗成:
项目根目录中(app.py同级)创建用于扩展类实例化的文件extensions.py
以flask-sqlalchemy扩展为例
1 | ini复制代码# @FileName: extendsions |
四.使用蓝图模块化程序
约定俗成:
创建
blueprints
目录用于存放各个蓝图,蓝图以包结构组织
1.创建蓝图
在每个蓝图包的init.py文件创建蓝图实例
1 | python复制代码# @FileName: __init__.py |
在蓝本对象的名称后添加一个_bp后缀.是为了更容易区分蓝本对象
2.注册蓝图
为了让蓝图发挥作用,我们需要把蓝本注册到程序实例上:
工厂函数中注册蓝图
3.使用蓝图
1 | python复制代码//blueprints/user/login.py |
五.构建NOSQL数据库连接模块
约定俗成:
项目根目录中(app.py同级)创建nosql数据库连接文件
nosql_connection.py
1 | ini复制代码from pymongo import MongoClient |
使用:
调用数据库连接方法,并传入相应参数,获取连接对象
1 | ini复制代码collection = mongodbConnection("address") |
六.集中式管理模型类
约定俗成:
项目根目录中(app.py同级)创建模型文件models.py
1 | ini复制代码# @FileName: models |
模型迁移
将模型类导入app.py(重要),只需导入
七.模块化静态文件和模板文件
约定俗成:
以蓝图模块划分,各个蓝图拥有各自的静态文件与模板
完整项目结构
本文转载自: 掘金