本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。

一个 Flask 应用(Flask Application)是 Flask 类(Flask Class)的实例。在前面的文章中,都是通过定义全局 Flask 实例的方式来编写的 Flask 应用代码,比如:

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "Hello, World!"

Python 的模块(Module)天然就是单例的,模块级别的对象自然而然也是单例的。这种方式在写简单的脚本时很方便,但如果是写项目,随着项目逐渐扩大,会出现越来越棘手的问题。

除了定义全局实例,还有一种方式叫做工厂函数(Factory Function),在 Flask 这,也能叫应用工厂(Application Factory),Flask 应用工厂函数的返回是 Flask 类的实例对象。

典型的 Flask 应用工厂函数如下所示:

import os

from flask import Flask


def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_mapping(
        SECRET_KEY='dev',
        DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
    )

    if test_config is None:
        # load the instance config, if it exists, when not testing
        app.config.from_pyfile('config.py', silent=True)
    else:
        # load the test config if passed in
        app.config.from_mapping(test_config)

    # ensure the instance folder exists
    try:
        os.makedirs(app.instance_path)
    except OSError:
        pass

    # a simple page that says hello
    @app.route('/hello')
    def hello():
        return 'Hello, World!'

    return app

这段代码可以放到 flaskr 目录下面的__init__.py文件中:

/home/user/Projects/flask-tutorial
├── flaskr/
│   ├── __init__.py

通过这段代码,我们可以看看 Flask 应用启动时,都干了些啥:

  1. app = Flask(__name__, instance_relative_config=True)创建了 Flask 实例。__name__是指当前模块的名字,这样 Flask 就能找到应用启动的入口。instance_relative_config=True告诉 Flask 配置文件是用的实例文件夹的相对路径。

    所谓实例文件夹,是指和 flaskr 同级的一个名字为 instance 的文件夹,适合存放私有配置的秘钥或者本地数据库等不需要上传到 Git 的文件,可以通过Flask.instance_path获取完整路径。

  2. app.config.from_mapping()设置了默认配置。SECRET_KEY是 Flask 用来给数据加密的私钥。DATABASE指定了数据库文件路径。

  3. app.config.from_pyfile()用来覆盖默认配置,from_pyfile 方法从文件获取配置,from_mapping 通过键值对设定配置。

  4. os.makedirs(app.instance_path)确保创建了实例文件夹。

  5. @app.route()定义了路由和处理函数。

总的来说,Flask 可以通过应用工厂(Application Factory)函数,在 Flask 应用启动时干这些事:实例化 Flask 对象→设定配置→创建实例文件夹→定义路由→定义处理函数。

Flask 启动后能看到以下日志:

* Serving Flask app "flaskr"
* Environment: development
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 855-212-761

除了python命令启动 Flask 应用,也可以直接用flask命令,示例如下:

> set FLASK_APP=flaskr
> set FLASK_ENV=development
> flask run

参考资料:

https://flask.palletsprojects.com/en/2.0.x/tutorial/factory/