flask应用程序配置

发布时间 2023-10-04 12:21:52作者: 蕝戀

flask中配置app的配置有几种方式,不同的场景适合用不同的方式。

配置定义方式如下:(注意:这几种方式都时可以混用的)

  • 直接调用app.config来设置。
app.config["SECRET_KEY"] = "sjhiq1y198798su656s#$#$%"
  • 从类对象中加载配置文件(优先级高于app.config直接设置)
app.config.from_object(类名)
  • 从环境变量中加载配置(优先级最高,会覆盖上面2种方式的同名配置项)
app.config.from_envvar("环境变量名", silent=Flase|True)
# 环境变量名: 值一般都是配置文件的相对路径或者绝对路径,文件中配置项一行一个,K=V形式。
# silent: 如果环境变量不存在是否抛出异常
  • 从py文件中加载配置(这个很少用...py文件中配置项的格式也是K=V形式)
app.config.from_pyfile("py文件")

实际开发中,多使用前3种方式来组合设置app的配置项。

直接调用app.config设置

适用场景:少量配置时可以这样操作

from flask import Flask

app = Flask(__name__)

# 少量信息可以直接app.config来设置(本质就是操作字典)
app.config["SECRET_KEY"] = "asdasdjhqkwehkjzxahkjabdmnasda"

@app.route('/demo1')
def demo1():
    print(f"{app.secret_key=}")
    return "config test001"


if __name__ == '__main__':
    app.run(debug=True)

从类对象中加载app配置

使用场景:

开发、生产、测试环境各不相同,通过类的方式取定义每个环境下的专属配置,方便修改和使用。

并且,这些环境中,可能会有相同的配置,这时候可以采用面向对象的封装思想。

from flask import Flask

app = Flask(__name__)

# 少量信息可以直接app.config来设置(本质就是在操作python字典)
app.config["SECRET_KEY"] = "asdasdjhqkwehkjzxahkjabdmnasda"
# 这两种方式都可以,因为一个是json类,一个是json类的具体实例。修改对应的类属性、实例属性,所以都有效果
app.json_provider_class.ensure_ascii = False
app.json.ensure_ascii = False

"""
定义一个基础的配置文件类.
    其他的配置文件类去继承这个基础的配置文件类

"""
class BaseConfiguration():
    """配置文件基类, 定义不同环境下相同的配置项"""
    SECRET_KEY = "SADAJDHKJSHDA"


class DEVConfiguration(BaseConfiguration):
    """
    开发环境配置
    """
    DEBUG = True  # 开发环境DEBUG肯定是True呀
    REDIS_MASTER_CLIENT = "192.168.1.1"


class ProdConfiguration(BaseConfiguration):
    """
    生产环境配置
    """
    DEBUG = False
    REDIS_MASTER_CLIENT = "172.10.155.1"


# 定义一个函数用于获取并返回配置
def config4env(want):
    # 使用字典将配置类一一映射。
    config_dict = {
        "dev": DEVConfiguration,
        "prod": ProdConfiguration
    }
    # 不用字典的get是因为,如果没有获取到正确的配置,希望直接抛出异常。而不是返回None
    return config_dict[want]

# 使用app.config.from_object(类对象)来导入配置
app.config.from_object(config4env("dev"))



@app.route('/demo1')
def demo1():
    print(f"{app.secret_key=}")
    print(f"{app.config.get('REDIS_MASTER_CLIENT')=}")
    return "config test001"



if __name__ == '__main__':
    app.run(debug=True)

从环境变量中加载配置

配置文件:secret_config.py(名字自己定义,叫什么都可以)

# 假设只有一个配置项,我不希望别人知道我的secret_key
SECRET_KEY = "888999888999aaaa"
from flask import Flask

class BaseConfiguration():
    SECRET_KEY = "SADAJDHKJSHDA"


class DEVConfiguration(BaseConfiguration):
    """
    开发环境配置
    """
    DEBUG = True
    REDIS_MASTER_CLIENT = "192.168.1.1"


class ProdConfiguration(BaseConfiguration):
    """
    生产环境配置
    """
    DEBUG = False
    REDIS_MASTER_CLIENT = "172.10.155.1"


def config4env(want):
    config_dict = {
        "dev": DEVConfiguration,
        "prod": ProdConfiguration
    }
    # 不用字典的get是因为,如果没有获取到正确的配置,希望直接抛出异常。
    return config_dict[want]


# 使用app.config.from_object(类对象)来导入配置
app.config.from_object(config4env("dev"))

# 从环境变量中读取配置文件
app.config.from_envvar("SECRET_CONFIG", silent=False)


@app.route('/demo1')
def demo1():
    # 因为环境变量的优先级高,会覆盖从类对象中加载的相同配置项
    # 所以这里打印的是888999888999aaaa,而不是SADAJDHKJSHDA
    print(f"{app.secret_key=}")


if __name__ == '__main__':
    app.run(debug=True)