# 配置
任何復雜點的應用,都不允許把配置寫在代碼里,要根據環境或安裝配置,而做不同的設置。
## 基礎
Sanic在application對象的`config`屬性中管理配置。配置對象就是一個可以通過*.*或字典屬性來修改的對象:
```py
app.config.DB_NAME = 'appdb'
app.config.DB_USER = 'appuser'
```
配置對象實際上是一個字典,可以使用`update`方法批量更新配置值。
```py
db_settings = {
'DB_HOST': 'localhost',
'DB_NAME': 'appdb',
'DB_USER': 'appuser'
}
app.config.update(db_settings)
```
通常配置參數都用大寫字母。
## 加載配置
有幾種發放來加載配置
### 從環境變量讀取
任何一個變量如果是`SANIC_`前綴開頭,都會被應用成Sanic配置。例如`SANIC_REQUEST_TIMEOUT`會自動被應用加載,并提供給`REQUEST_TIMEOUT`變量。你也可以傳遞一個其它前綴:
```py
app = Sanic(load_env='MYAPP_')
```
然后,上面的超時配置環境變量會變成`MYAPP_REQUEST_TIMEOUT`:
```py
environ["MYAPP_REQUEST_TIMEOUT"] = "42"
app = Sanic(load_env='MYAPP_')
assert app.config.REQUEST_TIMEOUT == 42
```
如果你想拒絕從環境變量中加載配置,可以把它設成`False`。
```py
app = Sanic(load_env=False)
```
### 從對象讀取
如果有非常多配置值,并且它們都有默認值,那么將它們放到一個對象里會更方便管理:
```py
class Config:
not_for_config = 'should not be used'
CONFIG_VALUE = 'should be used'
app = Sanic('test_load_from_object')
app.config.from_object(Config)
assert app.config.CONFIG_VALUE == 'should be used'
assert 'not_for_config' not in app.config
```
> 配置變量需要全部是大寫
### 從文件中讀取
通常我們希望要加載的配置文件不限定為應用的一部分,例如配置文件統一放在一個配置目錄下`from_pyfile(/path/to/config_file)`。但是這么做,需要程序內寫好配置文件的路徑,所以我們可以把配置文件路徑寫到環境變量中,由Sanic加載。
```py
app = Sanic('myapp')
app.config.from_envvar('MYAPP_SETTINGS')
```
然后我們就可以使用`MYAPP_SETTINGS`環境變量來設置配置文件路徑了
```bash
$ MYAPP_SETTINGS=/path/to/config_file python3 myapp.py
```
配置文件是一個正常的Python文件,只有全部為大寫字母的變量才會被加載,通常文件內容都是如下所示的鍵值對。
```py
# config_file
DB_HOST = 'localhost'
DB_NAME = 'appdb'
DB_USER = 'appuser'
```
## 內置變量
目前來說,Sanic有一些預定義的配置變量,我們編寫應用時可以覆蓋它們
|變量名|默認值|描述|
| ------------- |:-------------:| -----:|
|REQUEST_MAX_SIZE|100000000|request最大長度(bytes)|
|REQUEST_TIMEOUT|60|request超時時間(秒)|
|RESPONSE_TIMEOUT|60|response超時時間|
|KEEP_ALIVE|True|是否維持長鏈接|
|KEEP_ALIVE_TIMEOUT|5|長鏈接超時時間(秒)|
關于長鏈接具體的具體信息,請參見[Wiki](https://en.wikipedia.org/wiki/Keepalive)或自行百度。