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

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

配置管理

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

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

內(nèi)置配置變量

以下配置變量由 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 頭部控制),那么 就會被完美打印。

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

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

配置的最佳實踐

前述的方法的缺點是測試有一點點麻煩。通常解決這個問題沒有標準答案,但有些好的好的建議:

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

  2. 不要編寫在導(dǎo)入時就訪問配置的代碼。如果你限制自己只能通過請求訪問代碼,那么 你可以以后按需配置對象。

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

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

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

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

實例文件夾

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.

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