Flask項目配置(Configuration)

shddk 8年前發布 | 14K 次閱讀 Flask Python開發

在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']

其實不就是設置了一個變量嘛……

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

  1. 直接寫出配置的值,像上面那樣。
  2. 對于 不適合寫在程序里的配置 ,比如密碼等,需要把配置寫入系統環境變量,然后使用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'])  # 獲取相應的配置類
...

關于大型項目結構,擴展的初始化,使用程序工廠函數創建程序實例等內容見后續。

相關鏈接

 

 

來自:https://zhuanlan.zhihu.com/p/24055329

 

 本文由用戶 shddk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!