在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ 配置管理
應(yīng)用環(huán)境
配置管理
大型應(yīng)用
可插撥視圖
Flask 方案
在 Shell 中使用 Flask
針對(duì)高級(jí)程序員的前言
使用藍(lán)圖的模塊化應(yīng)用
部署方式
信號(hào)
排除應(yīng)用錯(cuò)誤
模板
請(qǐng)求環(huán)境
掌握應(yīng)用錯(cuò)誤
測(cè)試 Flask 應(yīng)用
前言
教程
安裝
快速上手
Flask 擴(kuò)展

配置管理

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ō)這不一定是一件壞事,但是還有更好的方法。

不管你使用何種方式載入配置,都可以使用 Flaskconfig 屬性來(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='...'
)

內(nèi)置配置變量

以下配置變量由 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ì)被完美打印。

關(guān)于 SERVER_NAME 的更多說(shuō)明

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ì)象的文檔。

配置的最佳實(shí)踐

前述的方法的缺點(diǎn)是測(cè)試有一點(diǎn)點(diǎn)麻煩。通常解決這個(gè)問(wèn)題沒(méi)有標(biāo)準(zhǔn)答案,但有些好的好的建議:

  1. 在一個(gè)函數(shù)中創(chuàng)建你的應(yīng)用并注冊(cè)“藍(lán)圖”。這樣就可以使用不同配置創(chuàng)建多個(gè)實(shí)例,極大方便單元測(cè)試。你可以按需載入配置。

  2. 不要編寫在導(dǎo)入時(shí)就訪問(wèn)配置的代碼。如果你限制自己只能通過(guò)請(qǐng)求訪問(wèn)代碼,那么 你可以以后按需配置對(duì)象。

開(kāi)發(fā)/生產(chǎn)

大多數(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')

配置的方法多種多樣,由你定度。以下是一些建議:

  • 在版本控制中保存一個(gè)缺省配置。要么在應(yīng)用中使用這些缺省配置,要么先導(dǎo)入缺省配置然后用你自己的配置文件來(lái)重載缺省配置。
  • 使用一個(gè)環(huán)境變量來(lái)切換不同的配置。這樣就可以在 Python 解釋器外進(jìn)行切換,而 根本不用改動(dòng)代碼,使開(kāi)發(fā)和部署更方便,更快捷。如果你經(jīng)常在不同的項(xiàng)目間 切換,那么你甚至可以創(chuàng)建代碼來(lái)激活 virtualenv 并導(dǎo)出開(kāi)發(fā)配置。
  • 在生產(chǎn)應(yīng)用中使用 fabric 之類的工具,向服務(wù)器分別傳送代碼和配置。更多細(xì)節(jié)參見(jiàn)使用 Fabric 部署方案。

實(shí)例文件夾

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.

上一篇:模板下一篇:大型應(yīng)用