New in version 0.3.
應(yīng)用總是需要一定的配置的。根據(jù)應(yīng)用環(huán)境不同,會(huì)需要不同的配置。比如開(kāi)關(guān)調(diào)試 模式、設(shè)置密鑰以及其他依賴于環(huán)境的東西。
Flask 的設(shè)計(jì)思路是在應(yīng)用開(kāi)始時(shí)載入配置。你可以在代碼中直接硬編碼寫入配置,對(duì)于 許多小應(yīng)用來(lái)說(shuō)這不一定是一件壞事,但是還有更好的方法。
不管你使用何種方式載入配置,都可以使用 Flask 的 config 屬性來(lái)操作配置的值。 Flask 本身就使用這個(gè)對(duì)象來(lái)保存 一些配置,擴(kuò)展也可以使用這個(gè)對(duì)象保存配置。同時(shí)這也是你保存配置的地方。
config 實(shí)質(zhì)上是一個(gè)字典的子類,可以像字典一樣操作:
app = Flask(__name__)
app.config['DEBUG'] = True
某些配置值還轉(zhuǎn)移到了 Flask 對(duì)象中,可以直接通過(guò) Flask 來(lái)操作:
app.debug = True
一次更新多個(gè)配置值可以使用 dict.update() 方法:
app.config.update(
DEBUG=True,
SECRET_KEY='...'
)
以下配置變量由 Flask 內(nèi)部使用:
| DEBUG | 開(kāi)關(guān)調(diào)試模式 |
|---|---|
| TESTING | 開(kāi)關(guān)測(cè)試模式 |
| PROPAGATE_EXCEPTIONS | 顯式開(kāi)關(guān)異常的傳播。當(dāng) TESTING 或 DEBUG 為真時(shí),總是開(kāi)啟的。 |
| PRESERVE_CONTEXT_ON_EXCEPTION | 缺省情況下,如果應(yīng)用在調(diào)試模式下運(yùn)行, 那么請(qǐng)求環(huán)境在發(fā)生異常時(shí)不會(huì)被彈出,以 方便調(diào)試器內(nèi)省數(shù)據(jù)??梢酝ㄟ^(guò)這個(gè)配置來(lái) 禁止這樣做。還可以使用這個(gè)配置強(qiáng)制不執(zhí)行 調(diào)試,這樣可能有助于調(diào)試生產(chǎn)應(yīng)用(風(fēng)險(xiǎn) 大)。 |
| SECRET_KEY | 密鑰 |
| SESSION_COOKIE_NAME | 會(huì)話 cookie 的名稱 |
| SESSION_COOKIE_DOMAIN | 會(huì)話 cookie 的域。如果沒(méi)有配置,那么 SERVER_NAME 的所有子域都可以使用 這個(gè) cookie 。 |
| SESSION_COOKIE_PATH | 會(huì)話 cookie 的路徑。如果沒(méi)有配置,那么 所有 APPLICATION_ROOT 都可以使用 cookie 。如果沒(méi)有設(shè)置 APPLICATION_ROOT ,那么 '/' 可以 使用 cookie 。 |
| SESSION_COOKIE_HTTPONLY | 設(shè)置 cookie 的 httponly 標(biāo)志,缺省為 True 。 |
| SESSION_COOKIE_SECURE | 設(shè)置 cookie 的安全標(biāo)志,缺省為 False 。 |
| PERMANENT_SESSION_LIFETIME | 常駐會(huì)話的存活期,其值是一個(gè) datetime.timedelta 對(duì)象。 自 Flask 0.8 開(kāi)始,其值可以是一個(gè)整數(shù), 表示秒數(shù)。 |
| USE_X_SENDFILE | 開(kāi)關(guān) x-sendfile |
| LOGGER_NAME | 日志記錄器的名稱 |
| SERVER_NAME | 服務(wù)器的名稱和端口號(hào),用于支持子域(如: 'myapp.dev:5000' )。注意設(shè)置為 “ localhost ”沒(méi)有用,因?yàn)?localhost 不 支持子域。設(shè)置了 SERVER_NAME 后,在 缺省情況下會(huì)啟用使用應(yīng)用環(huán)境而不使用請(qǐng)求 環(huán)境的 URL 生成。 |
| APPLICATION_ROOT | 如果應(yīng)用不占用整個(gè)域或子域,那么可以用 這個(gè)配置來(lái)設(shè)定應(yīng)用的路徑。這個(gè)配置還用作 會(huì)話 cookie 的路徑。如果使用了整個(gè)域, 那么這個(gè)配置的值應(yīng)當(dāng)為 None 。 |
| MAX_CONTENT_LENGTH | 這個(gè)配置的值單位為字節(jié),如果設(shè)置了,那么 Flask 會(huì)拒絕超過(guò)設(shè)定長(zhǎng)度的請(qǐng)求,返回一個(gè) 413 狀態(tài)碼。 |
| SEND_FILE_MAX_AGE_DEFAULT | send_static_file() ( 缺省靜態(tài)文件處理器)和 send_file() 使用的缺省緩存 最大存活期控制,以秒為單位。把 get_send_file_max_age() 分別掛勾到 Flask 或 Blueprint 上,可以重載每個(gè) 文件的值。缺省值為 43200 ( 12 小時(shí))。 |
| TRAP_HTTP_EXCEPTIONS | 如果設(shè)置為 True ,那么 Flask 將不 執(zhí)行 HTTP 異常的錯(cuò)誤處理,而是把它像其它 異常同樣對(duì)待并把它壓入異常堆棧。當(dāng)你在 必須查找出一個(gè) HTTP 異常來(lái)自哪里的情況下 這個(gè) 配置比較有用。 |
| TRAP_BAD_REQUEST_ERRORS | Werkzeug 用于處理請(qǐng)求特殊數(shù)據(jù)的內(nèi)部數(shù)據(jù) 結(jié)構(gòu)會(huì)引發(fā)壞請(qǐng)求異常。同樣,許多操作為了 一致性會(huì)使用一個(gè)壞請(qǐng)求隱藏操作失敗。在 這種情況下,這個(gè)配置可以在調(diào)試時(shí)辨別到底 為什么會(huì)失敗。如果這個(gè)配置設(shè)為 True ,那么就只能得到一個(gè)普通的反饋。 |
| PREFERRED_URL_SCHEME | 在沒(méi)有可用的模式的情況下, URL 生成所 使用的 URL 模式。缺省值為 http 。 |
| JSON_AS_ASCII | 缺省情況下 Flask 把對(duì)象序列化為 ascii-encoded JSON 。如果這個(gè)參數(shù)值為 False ,那么 Flask 就不會(huì)把對(duì)象編碼 為 ASCII ,只會(huì)原樣輸出返回 unicode 字符 串。 jsonfiy 會(huì)自動(dòng)把對(duì)象編碼 utf-8 字符用于傳輸。 |
| JSON_SORT_KEYS | 缺省情況下 Flask 會(huì)按鍵值排序 JSON 對(duì)象, 這是為了確保字典的哈希種子的唯一性,返回 值會(huì)保持一致,不會(huì)破壞外部 HTTP 緩存。 改變這個(gè)參數(shù)的值就可以重載缺省的行為, 重載后可能會(huì)提高緩存的性能,但是不推薦 這樣做。 |
| JSONIFY_PRETTYPRINT_REGULAR | 如果這個(gè)參數(shù)設(shè)置為 True (缺省值), 并且如果 jsonify 響應(yīng)不是被一個(gè) XMLHttpRequest 對(duì)象請(qǐng)求的(由 X-Requested-With 頭部控制),那么 就會(huì)被完美打印。 |
SERVER_NAME 配置用于支持子域。如果要使用子域,那么就需要這個(gè)配置。因?yàn)?Flask 在不知道真正服務(wù)器名稱的情況下無(wú)法得知子域。這個(gè)配置也用于會(huì)話 cookie 。
請(qǐng)記住,不僅 Flask 是在使用子域時(shí)有這樣的問(wèn)題,你的瀏覽器同樣如此。大多數(shù) 現(xiàn)代瀏覽器不會(huì)允許在沒(méi)有點(diǎn)的服務(wù)器名稱上設(shè)置跨子域 cookie 。因此,如果你的 服務(wù)器名稱是 'localhost' ,那么你將不能為 'localhost' 和所有子域設(shè)置 cookie 。在這種情況下請(qǐng)選擇一個(gè)其他服務(wù)器名稱,如 'myapplication.local' 。并且把名稱加上要使用的子域?qū)懭胫鳈C(jī)配置中或者設(shè)置 一個(gè)本地 bind 。 New in version 0.4: LOGGER_NAME
New in version 0.5: SERVER_NAME
New in version 0.6: MAX_CONTENT_LENGTH
New in version 0.7: PROPAGATE_EXCEPTIONS, PRESERVE_CONTEXT_ON_EXCEPTION
New in version 0.8: TRAP_BAD_REQUEST_ERRORS, TRAP_HTTP_EXCEPTIONS, APPLICATION_ROOT, SESSION_COOKIE_DOMAIN, SESSION_COOKIE_PATH, SESSION_COOKIE_HTTPONLY, SESSION_COOKIE_SECURE
New in version 0.9: PREFERRED_URL_SCHEME
New in version 0.10: JSON_AS_ASCII, JSON_SORT_KEYS, JSONIFY_PRETTYPRINT_REGULAR
如果把配置放在一個(gè)單獨(dú)的文件中會(huì)更有用。理想情況下配置文件應(yīng)當(dāng)放在應(yīng)用包的 外面。這樣可以在修改配置文件時(shí)不影響應(yīng)用的打包與分發(fā)( 使用 Distribute 部署 )。
因此,常見(jiàn)用法如下:
app = Flask(__name__)
app.config.from_object('yourapplication.default_settings')
app.config.from_envvar('YOURAPPLICATION_SETTINGS')
首先從 yourapplication.default_settings 模塊載入配置,然后根據(jù) YOURAPPLICATION_SETTINGS 環(huán)境變量所指向的文件的內(nèi)容重載配置的值。在 啟動(dòng)服務(wù)器前,在 Linux 或 OS X 操作系統(tǒng)中,這個(gè)環(huán)境變量可以在終端中使用 export 命令來(lái)設(shè)置:
$ export YOURAPPLICATION_SETTINGS=/path/to/settings.cfg
$ python run-app.py
* Running on http://127.0.0.1:5000/
* Restarting with reloader...
在 Windows 系統(tǒng)中使用內(nèi)置的 set 來(lái)代替:
>set YOURAPPLICATION_SETTINGS=\path\to\settings.cfg
配置文件本身實(shí)質(zhì)是 Python 文件。只有全部是大寫字母的變量才會(huì)被配置對(duì)象所使用。 因此請(qǐng)確保使用大寫字母。
一個(gè)配置文件的例子:
# 配置示例
DEBUG = False
SECRET_KEY = '?\xbf,\xb4\x8d\xa3"<\x9c\xb0@\x0f5\xab,w\xee\x8d$0\x13\x8b83'
請(qǐng)確保盡早載入配置,以便于擴(kuò)展在啟動(dòng)時(shí)可以訪問(wèn)相關(guān)配置。除了從文件載入配置外, 配置對(duì)象還有其他方法可以載入配置,詳見(jiàn) Config 對(duì)象的文檔。
前述的方法的缺點(diǎn)是測(cè)試有一點(diǎn)點(diǎn)麻煩。通常解決這個(gè)問(wèn)題沒(méi)有標(biāo)準(zhǔn)答案,但有些好的好的建議:
在一個(gè)函數(shù)中創(chuàng)建你的應(yīng)用并注冊(cè)“藍(lán)圖”。這樣就可以使用不同配置創(chuàng)建多個(gè)實(shí)例,極大方便單元測(cè)試。你可以按需載入配置。
大多數(shù)應(yīng)用需要一個(gè)以上的配置。最起碼需要一個(gè)配置用于生產(chǎn)服務(wù)器,另一個(gè)配置用于 開(kāi)發(fā)。應(yīng)對(duì)這種情況的最簡(jiǎn)單的方法總是載入一個(gè)缺省配置,并把這個(gè)缺省配置作為版本 控制的一部分。然后,把需要重載的配置,如前文所述,放在一個(gè)獨(dú)立的文件中:
app = Flask(__name__)
app.config.from_object('yourapplication.default_settings')
app.config.from_envvar('YOURAPPLICATION_SETTINGS')
然后你只要增加一個(gè)獨(dú)立的 config.py 文件并導(dǎo)出 YOURAPPLICATION_SETTINGS=/path/to/config.py 就可了。當(dāng)然還有其他方法可選, 例如可以使用導(dǎo)入或子類。
在 Django 應(yīng)用中,通常的做法是在文件的開(kāi)關(guān)增加 from yourapplication.default_settings import * 進(jìn)行顯式地導(dǎo)入,然后手工重載 配置。你還可以通過(guò)檢查一個(gè) YOURAPPLICATION_MODE 之類的環(huán)境變量(變量值設(shè)置 為 production 或 development 等等)來(lái)導(dǎo)入不同的配置文件。
一個(gè)有趣的方案是使用類和類的繼承來(lái)配置:
class Config(object):
DEBUG = False
TESTING = False
DATABASE_URI = 'sqlite://:memory:'
class ProductionConfig(Config):
DATABASE_URI = 'mysql://user@localhost/foo'
class DevelopmentConfig(Config):
DEBUG = True
class TestingConfig(Config):
TESTING = True
如果要使用這樣的方案,那么必須使用 from_object():
app.config.from_object('configmodule.ProductionConfig')
配置的方法多種多樣,由你定度。以下是一些建議:
New in version 0.8.
Flask 0.8 引入了實(shí)例文件夾。 Flask 花了很長(zhǎng)時(shí)間才能夠直接使用應(yīng)用文件夾的路徑( 通過(guò) Flask.root_path )。這也是許多開(kāi)發(fā)者載入應(yīng)用文件夾外的配置的方法。 不幸的是這種方法只能用于應(yīng)用不是一個(gè)包的情況下,即根路徑指向包的內(nèi)容的情況。
Flask 0.8 引入了一個(gè)新的屬性: Flask.instance_path 。它指向一個(gè)新名詞: “實(shí)例文件夾”。實(shí)例文件夾應(yīng)當(dāng)處于版本控制中并進(jìn)行特殊部署。這個(gè)文件夾特別適合存放需要在應(yīng)用運(yùn)行中改變的東西或者配置文件。
可以要么在創(chuàng)建 Flask 應(yīng)用時(shí)顯式地提供實(shí)例文件夾的路徑,要么讓 Flask 自動(dòng)探測(cè)實(shí)例文件夾。顯式定義使用 instance_path 參數(shù):
app = Flask(__name__, instance_path='/path/to/instance/folder')
請(qǐng)記住,這里提供的路徑必須是絕對(duì)路徑。
如果 instance_path 參數(shù)沒(méi)有提供,那么會(huì)使用以下缺省位置:
/myapp.py
/instance
/myapp
/__init__.py
/instance
$PREFIX/lib/python2.X/site-packages/myapp
$PREFIX/var/myapp-instance
$PREFIX 是你的 Python 安裝的前綴??赡苁?/usr 或你的 virtualenv 的路徑。可以通過(guò)打印 sys.prefix 的值來(lái)查看當(dāng)前的前綴的值。
既然可以通過(guò)使用配置對(duì)象來(lái)根據(jù)關(guān)聯(lián)文件名從文件中載入配置,那么就可以通過(guò)改變與 實(shí)例路徑相關(guān)聯(lián)的文件名來(lái)按需要載入不同配置。在配置文件中的關(guān)聯(lián)路徑的行為可以在 “關(guān)聯(lián)到應(yīng)用的根路徑”(缺省的)和 “關(guān)聯(lián)到實(shí)例文件夾”之間變換,具體通過(guò)應(yīng)用構(gòu)建函數(shù)中的 instance_relative_config 來(lái)實(shí)現(xiàn):
app = Flask(__name__, instance_relative_config=True)
以下是一個(gè)完整的配置 Flask 的例子,從一個(gè)模塊預(yù)先載入配置,然后從配置文件夾中的 一個(gè)配置文件(如果這個(gè)文件存在的話)載入要重載的配置:
app = Flask(__name__, instance_relative_config=True)
app.config.from_object('yourapplication.default_settings')
app.config.from_pyfile('application.cfg', silent=True)
通過(guò) Flask.instance_path 可以找到實(shí)例文件夾的路徑。 Flask 還提供一個(gè)打開(kāi)實(shí)例文件夾中的文件的快捷方法: Flask.open_instance_resource() 。
舉例說(shuō)明:
filename = os.path.join(app.instance_path, 'application.cfg')
with open(filename) as f:
config = f.read()
# 或者通過(guò)使用 open_instance_resource:
with app.open_instance_resource('application.cfg') as f:
config = f.read()
? Copyright 2013, Armin Ronacher. Created using Sphinx.