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)
标签:__,配置文件,flask,True,app,配置,应用程序,config
From: https://www.cnblogs.com/juelian/p/17742129.html