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