Flask項目配置(Configuration)
在Flask項目中,我們會用到很多配置(Config)。比如說設置秘鑰,設置資料庫地址,像下面這樣:
...napp.config[SECRET_KEY] = some strange wordsn
Flask的配置對象(config)是一個字典的子類(subclass),所以你可以把配置用鍵值對的方式存儲進去。這是一個通用的處理介面,Flask內置的配置,擴展提供的配置,你自己的配置,都集中在一處。
為什麼需要使用自己的配置?
假設你在做一個博客,有十個視圖函數都定義了每頁顯示的文章數。當你寫好以後,發現每頁的文章太多,想把這個值改小一點,這時你要找到這十個視圖函數,分別修改這個值,很蠢吧?使用配置你就使用一行控制所有的變數:
app.config[POST_PER_PAGE] = 12
在十個視圖函數里使用配置變數代替固定值:npost_per_page = app.config[POST_PER_PAGE]n其實不就是設置了一個變數嘛……n
你有兩種方式來設置配置:
- 直接寫出配置的值,像上面那樣。
- 對於不適合寫在程序里的配置,比如密碼等,需要把配置寫入系統環境變數,然後使用os模塊的getenv()方法獲取,第二個參數作為默認值:
set MAIL_USERNAME=me@greyli.com # windowsnexport MAIL_USERNAME=me@greyli.com # *unixn
獲取變數並寫入:
import osnnfrom flask import Flasknnapp = Flask(__name__)napp.config[MAIL_USERNAME] = os.getenv(MAIL_USERNAME, me@greyli.com)n
如果你使用虛擬環境,設置環境變數時注意要激活虛擬環境,同時不要給變數值加引號。
set MAIL_USERNAME=me@greyli.com # 結果是me@greyli.comnset MAIL_USERNAME=me@greyli.com # 結果是"me@greyli.com"n
你有三種方式來處理配置。
直接寫入主腳本
當你的程序很小的時候,可以直接把配置寫在主腳本里:
from flask import Flasknnapp = Flask(__name__)napp.config[SECRET_KEY] = some secret wordsnapp.config[DEBUG] = Truenapp.config[ITEMS_PER_PAGE] = 10n
使用字典的update方法可以簡化代碼:
from flask import Flasknnapp = Flask(__name__)napp.config.update(n DEBUG=True,n SECRET_KEY=some secret words,n ITEMS_PER_PAGE=10n)n
單獨的配置文件
程序逐漸變大時,配置也逐漸增多,寫在主腳本里太佔地方,不夠優雅(這時你應該已經把表單,路由,資料庫模型等等分成獨立的文件了。關於大型項目結構,後續會總結)。我們可以創建一個單獨的配置文件。和上面同樣的配置,現在可以改寫為:
config.py
SECRET_KEY = some secret wordsnDEBUG = TruenITEMS_PER_PAGE = 10n
在創建程序實例後導入配置:
import confignn...napp = Flask(__name__)napp.config.from_object(config)n...n
或是:
...napp = Flask(__name__)napp.config.from_pyfile(config.py)n...n
創建不同的配置類
大型項目需要多個配置組合,比如開發時的配置,測試的配置,部署的配置……這樣我們需要在配置文件里創建不同的配置類,然後在創建程序實例時引入相應的配置類。
最佳實踐是創建一個存儲通用配置的基類,然後為不同的使用使用場景創建新的繼承基類的配置類:
config.py(這裡為開發和測試創建了不同的資料庫)
import osnbasedir = os.path.abspath(os.path.dirname(__file__))nnnclass BaseConfig: # 基本配置類n SECRET_KEY = os.getenv(SECRET_KEY, some secret words)n ITEMS_PER_PAGE = 10nnnclass DevelopmentConfig(BaseConfig):n DEBUG = Truen SQLALCHEMY_DATABASE_URI = os.getenv(DEV_DATABASE_URL, sqlite:/// + os.path.join(basedir, data-dev.sqlite)nnnclass TestingConfig(BaseConfig):n TESTING = Truen SQLALCHEMY_DATABASE_URI = os.getenv(TEST_DATABASE_URL, sqlite:/// + os.path.join(basedir, data-test.sqlite)n WTF_CSRF_ENABLED = Falsennnconfig = {n development: DevelopmentConfig,n testing: TestingConfig,nn default: DevelopmentConfign}n
通過from_object()方法導入配置:
from config import config # 導入存儲配置的字典nn...napp = Flask(__name__)napp.config.from_object(config[development]) # 獲取相應的配置類n...n
關於大型項目結構,擴展的初始化,使用程序工廠函數創建程序實例等內容見後續。
相關鏈接
- Flask的內置配置值:Configuration Handling
- Flask配置文檔:Configuration Handling
- 《Flask Web開發》中的配置文件:https://github.com/greyli/flasky/blob/master/config.py
- - - - -
更多關於Flask和Web開發的優質原創內容,歡迎關注Hello, Flask! - 知乎專欄。
推薦閱讀:
※python主要用於什麼開發?
※用Python實現excel 14個常用操作
※PyQt5系列教程(16):小車快跑(滑塊的使用)
※如何在阿里ECS雲端運行Jupyter Notebook進行機器/深度學習?
※對於 Python 的科學計算有哪些提高運算速度的技巧?