Flask項目配置(Configuration)
在Flask項目中,我們會用到很多配置(Config)。比如說設置秘鑰,設置數據庫地址,像下面這樣:
...
app.config['SECRET_KEY'] = 'some strange words'
Flask的配置對象(config)是一個字典的子類(subclass),所以你可以把配置用鍵值對的方式存儲進去。這是一個通用的處理接口,Flask內置的配置,擴展提供的配置,你自己的配置,都集中在一處。
為什么需要使用自己的配置?
假設你在做一個博客,有十個視圖函數都定義了每頁顯示的文章數。當你寫好以后,發現每頁的文章太多,想把這個值改小一點,這時你要找到這十個視圖函數,分別修改這個值,很蠢吧?使用配置你就使用一行控制所有的變量:
app.config['POST_PER_PAGE'] = 12
在十個視圖函數里使用配置變量代替固定值:
post_per_page = app.config['POST_PER_PAGE']
其實不就是設置了一個變量嘛……
你有兩種方式來設置配置:
- 直接寫出配置的值,像上面那樣。
- 對于 不適合寫在程序里的配置 ,比如密碼等,需要把配置寫入系統環境變量,然后使用os模塊提供的方法獲取:
set MAIL_USERNAME=me@greyli.com # windows
export MAIL_USERNAME=me@greyli.com # *unix
獲取變量并寫入:
import os
from flask import Flask
app = Flask(__name__)
app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME')
如果你使用虛擬環境,設置環境變量時注意要激活虛擬環境,同時不要給變量值加引號。
set MAIL_USERNAME=me@greyli.com # 結果是'me@greyli.com'
set MAIL_USERNAME='me@greyli.com' # 結果是"'me@greyli.com'"
你有三種方式來處理配置。
直接寫入主腳本
當你的程序很小的時候,可以直接把配置寫在主腳本里:
from flask import Flask
app = Flask(__name__)
app.config['SECRET_KEY'] = 'some secret words'
app.config['DEBUG'] = True
app.config['ITEMS_PER_PAGE'] = 10
使用字典的update方法可以簡化代碼:
from flask import Flask
app = Flask(__name__)
app.config.update(
DEBUG=True,
SECRET_KEY='some secret words',
ITEMS_PER_PAGE=10
)
單獨的配置文件
程序逐漸變大時,配置也逐漸增多,寫在主腳本里太占地方,不夠優雅(這時你應該已經把表單,路由,數據庫模型等等分成獨立的文件了。關于大型項目結構,后續會總結)。我們可以創建一個單獨的配置文件。和上面同樣的配置,現在可以改寫為:
config.py
SECRET_KEY = 'some secret words'
DEBUG = True
ITEMS_PER_PAGE = 10
在創建程序實例后導入配置:
import config
...
app = Flask(__name__)
app.config.from_object(config)
...
創建不同的配置類
大型項目需要多個配置組合,比如開發時的配置,測試的配置,部署的配置……這樣我們需要在配置文件里創建不同的配置類,然后在創建程序實例時引入相應的配置類。
最佳實踐是創建一個 存儲通用配置 的基類,然后為不同的使用使用場景創建新的繼承基類的配置類:
config.py(這里為開發和測試創建了不同的數據庫)
import os
basedir = os.path.abspath(os.path.dirname(__file__))
class Config: # 基類
SECRET_KEY = 'some secret words'
ITEMS_PER_PAGE = 10
class DevelopmentConfig(Config):
DEBUG = True
SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \
'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite')
class TestingConfig(Config):
TESTING = True
SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URL') or \
'sqlite:///' + os.path.join(basedir, 'data-test.sqlite')
WTF_CSRF_ENABLED = False
config = {
'development': DevelopmentConfig,
'testing': TestingConfig,
'default': DevelopmentConfig
}
通過from_object()方法導入配置:
from config import config # 導入存儲配置的字典
...
app = Flask(__name__)
app.config.from_object(config['development']) # 獲取相應的配置類
...
關于大型項目結構,擴展的初始化,使用程序工廠函數創建程序實例等內容見后續。
相關鏈接
- Flask的內置配置值: http:// flask.pocoo.org/docs/0. 11/config/#builtin-configuration-values
- Flask配置文檔: http:// flask.pocoo.org/docs/0. 11/config/#configuration-handling
- 《Flask Web開發》中的配置文件: https:// github.com/greyli/flask y/blob/master/config.py
來自:https://zhuanlan.zhihu.com/p/24055329