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

你有兩種方式來設置配置:

  1. 直接寫出配置的值,像上面那樣。
  2. 對於不適合寫在程序里的配置,比如密碼等,需要把配置寫入系統環境變數,然後使用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開發》中的配置文件:github.com/greyli/flask

- - - - -

更多關於Flask和Web開發的優質原創內容,歡迎關注Hello, Flask! - 知乎專欄。

推薦閱讀:

python主要用於什麼開發?
用Python實現excel 14個常用操作
PyQt5系列教程(16):小車快跑(滑塊的使用)
如何在阿里ECS雲端運行Jupyter Notebook進行機器/深度學習?
對於 Python 的科學計算有哪些提高運算速度的技巧?

TAG:Flask | Web开发 | Python |