无论是一个单文件项目还是一个多功能模块的大型项目,我们始终应该明白,Flask 应用程序是 Flask 类的一个实例。基于此,那么第一件事就是实例化一个Flask对象!
创建 Flask 应用程序最直接的方法是直接在代码顶部创建一个全局 Flask 实例,就像我们快速上手中的那样!
在大型项目中这种做法是行不通的,而是在一个函数内创建它。此函数被称为应用程序工厂,简称-工厂函数。应用程序所需的任何配置、注册和其他设置都将在函数内部进行,然后应用程序将被返回。
创建工厂函数在项目目录(RealProject)目录下的__init__.py中创建如下代码:
import os
from flask import Flask
def create_app(test_config=None):
# create and configure the app
## instance_relative_config设置为True则代表开启从文件加载配置,默认为False
app = Flask(__name__, instance_relative_config=True)
# app.config其实调用的是flask类的config属性,该属性又被设置为了一个Config的类
## from_mapping则是该Config类下的一个方法,用来更新默认配置,返回值为True
## 至于Flask的默认配置项都有哪些,其实可以深入源码查看default_config属性所列出的项
# 默认配置
app.config.from_mapping(
SECRET_KEY='dev',
DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
)
# 这里做了判断是否运行时传入了测试配置
if test_config is None:
# 如果没有传入,则从py文件加载配置,silent=True代表文件,文件加载成功则返回True
app.config.from_pyfile('settings.py', silent=True)
else:
# 和最开始的配置意思一致
app.config.from_mapping(test_config)
# 递归创建目录,确保项目文件存在
try:
os.makedirs(app.instance_path)
except OSError:
pass
return app
代码详解
以上代码在注释中已经有详细说明,但这里有必要再对每一行代码做详细逐一解释,顺序依次从上往下!
1、创建一个create_app的函数,并默认传入test_config的参数,默认值为None!
def create_app(test_config=None):
2、实例化一个FLask对象,第一个参数__name__为必填参数,其意思请参照快速上手中的说明! 第二件关键字参数instance_relative_config是Flask类的一个默认参数,默认值为False,设置为True则代表开启从文件价和文件中加载配置!
app = Flask(__name__, instance_relative_config=True)
3、为实例创建配置
- app.config其实调用的是Flask类的config属性,该属性又被设置为了一个Config的类
- from_mapping则是该Config类下的一个方法,用来更新配置,返回值为True
- 这个在这里就相当于为我们这个实例添加了一个默认的配置项
- 至于Flask的默认配置项都有哪些,其实可以深入源码查看default_config属性所列出的项
app.config.from_mapping(
SECRET_KEY='dev',
DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
)
4、以下代码对工厂函数传入的参数做了判断,起到切换配置的作用!
if test_config is None:
# 如果没有传入,则从py文件加载配置,silent=True代表文件,文件加载成功则返回True
app.config.from_pyfile('settings.py', silent=True)
else:
# 和最开始的配置意思一致
app.config.from_mapping(test_config)
5、确保项目目录存在,递归创建目录,这个不太重要,了解即可
try:
os.makedirs(app.instance_path)
except OSError:
pass


