Sanic 配置简介#

Sanic 在应用程序对象的 config 属性中持有配置。配置对象只是使用点表示法或像字典一样修改的对象。

app = Sanic("myapp")
app.config.DB_NAME = "appdb"
app.config["DB_USER"] = "appuser"

你也可以像在普通字典上一样使用 update() 方法:

db_settings = {
    'DB_HOST': 'localhost',
    'DB_NAME': 'appdb',
    'DB_USER': 'appuser'
}
app.config.update(db_settings)

备注

在 Sanic 中,将配置值命名为大写字母是标准做法。实际上,如果你开始混合使用大写和小写名称,可能会遇到奇怪的行为。

载入配置#

环境变量配置 Sanic#

任何以 SANIC_ 前缀定义的环境变量都将应用到 Sanic 配置中。例如,设置 SANIC_REQUEST_TIMEOUT 将由应用程序自动加载并输入到 REQUEST_TIMEOUT 配置变量中。

$ export SANIC_REQUEST_TIMEOUT=10
>>> print(app.config.REQUEST_TIMEOUT)
10

你可以更改 Sanic 在启动时期望的前缀。

$ export MYAPP_REQUEST_TIMEOUT=10
>>> app = Sanic(__name__, env_prefix='MYAPP_')
>>> print(app.config.REQUEST_TIMEOUT)
10

你还可以完全禁用环境变量加载。

app = Sanic(__name__, load_env=False)

使用 app.update_config#

Sanic 实例有非常通用的方法用于加载配置:app.update_config。你可以向它提供文件路径、字典、类,或者其他任何类型的对象。

从文件中加载配置#

假设你有名为 my_config.py 的文件,它看起来是这样的。

# my_config.py
A = 1
B = 2

你可以通过将文件路径传递给 app.update_config 来将其作为配置值加载。

>>> app.update_config("/path/to/my_config.py")
>>> print(app.config.A)
1

这个路径也接受 bash 风格的环境变量。

$ export my_path="/path/to"
>>> app.update_config("${my_path}/my_config.py")

备注

只需记住,你必须以 ${environment_variable} 的格式提供环境变量,而 $environment_variable 不会被展开(被视为“普通”文本)。

从 dict 或者 class 加载配置#

app.update_config 也支持 普通的 dict 对象:

app.update_config({"A": 1, "B": 2})

你可以定义自己的配置类,并将其传递给 app.update_config

class MyConfig:
    A = 1
    B = 2

app.update_config(MyConfig)

它甚至可以被实例化:

app.update_config(MyConfig())

类型 cast#

当从环境变量加载时,Sanic 会尝试将值转换为预期的 Python 类型。这特别适用于:intfloatbool

关于布尔值,允许以下不区分大小写的值:

  • True: y, yes, yep, yup, t, true, on, enable, enabled, 1

  • False: n, no, f, false, off, disable, disabled, 0

如果值无法转换,它将默认为 str

此外,Sanic 可以通过使用额外的类型转换器来配置以转换其他类型。这应该是任何可调用的,返回值或引发 ValueError

app = Sanic(..., config=Config(converters=[UUID]))