【理論】
在很多情況下,你需要設置程序的某些行為,這時你就需要使用配置變量。在Flask中,配置變量就是一些大寫形式的Python變量,
你也可以稱之為配置參數或配置鍵。使用統一的配置變量可以避免在程序中以硬編碼的形式設置程序。
在一個項目中,你會用到許多配置,Flask提供的配置,擴展(比如flask-sqlalchemy,flask-mail)提供的配置,還有程序特定的配置。
和平時使用的變量不同,這些配置變量都通過Flask對象的app.config屬性作為統一的接口來設置和獲取,它指向的Config類實際上是字典的的子類,
所以你可以像操作其它字典一樣操作它。
當我們創建1個Flask對象(也就是app),就可以通過app.config來查看這個app的所有配置變量
from flask import Flask app=Flask(__name__) print(type(app.config)) <class 'flask.config.Config'>#app.config的類型
print(app.config)#app.config 以鍵值對的形式 保存app的配置信息
<Config {'ENV': 'production', 'DEBUG': False, 'TESTING': False, 'PROPAGATE_EXCEPTIONS': None, 'PRESERVE_CONTEXT_ON_EXCEPTION': None, 'SECRET_KEY': None, 'PERMANENT_SESSION_LIFETIME': datetime.timedelta(days=31), 'USE_X_SENDFILE': False, 'SERVER_NAME': None, 'APPLICATION_ROOT': '/', 'SESSION_COOKIE_NAME': 'session', 'SESSION_COOKIE_DOMAIN': None, 'SESSION_COOKIE_PATH': None, 'SESSION_COOKIE_HTTPONLY': True, 'SESSION_COOKIE_SECURE': False, 'SESSION_COOKIE_SAMESITE': None, 'SESSION_REFRESH_EACH_REQUEST': True, 'MAX_CONTENT_LENGTH': None, 'SEND_FILE_MAX_AGE_DEFAULT': datetime.timedelta(seconds=43200), 'TRAP_BAD_REQUEST_ERRORS': None, 'TRAP_HTTP_EXCEPTIONS': False, 'EXPLAIN_TEMPLATE_LOADING': False, 'PREFERRED_URL_SCHEME': 'http', 'JSON_AS_ASCII': True, 'JSON_SORT_KEYS': True, 'JSONIFY_PRETTYPRINT_REGULAR': False, 'JSONIFY_MIMETYPE': 'application/json', 'TEMPLATES_AUTO_RELOAD': None, 'MAX_COOKIE_SIZE': 4093}>
常用配置及含義:
ENV:測試環境
production:生產環境,development:開發環境
DEBUG:是否開啟debug模式
SECRET_KEY:密鑰字符串
JSON_AS_ASCII:是否以ascii編碼展示響應報文
JSONIFY_MIMETYPE:響應報文類型
值得注意的是:
如果響應報文含中文,JSON_AS_ASCII的值為False,JSONIFY_MIMETYPE值為"application/json;charset=utf-8",
否則響應報文中的中文會顯示亂碼
JSON_AS_ASCII =False JSONIFY_MIMETYPE = "application/json;charset=utf-8"
【實踐】
Flask提供了很多種方式來加載配置。比如,你可以像在字典中添加一個鍵值對一樣來設置一個配置:
app.config['ADMIN_NAME']='Peter'
注意:配置的名稱必須是全大寫形式,小寫的變量將不會被讀取
除此之外,還可以通過把配置變量存儲在單獨的Python腳本、JSON格式的文件或是Python類中,config對象提供了相應的方法來導入配置。
和操作字典一樣,讀取一個配置就是從config字典里通過將配置的名稱作為鍵讀取對應的值:
value=app.config['ADMIN_NAME']
注意:某些擴展需要讀取配置值來完成初始化操作,比如Flask-Mail,因此我們應該盡量將加載配置的操作提前,最好在程序實例app創建后就加載配置。
下面將逐一演示各種配置方式,及其效果
目錄結構:
通過 鍵值對 配置app.config:
from flask import Flask app =Flask(__name__) print('配置前',app.config.get('FLASK_ENV')) #使用鍵值對配置app環境變量
app.config['FLASK_ENV']='ABC'
print('配置后',app.config.get('FLASK_ENV')) #------運行結果----------------
配置前 None 配置后 ABC
使用update()方法可以一次加載多個值:
from flask import Flask
app =Flask(__name__)
print('配置前',app.config.get('FLASK_ENV'))
#使用 update()方法可以一次加載多個值
app.config.update(
FLASK_ENV='ABC',
AAAA=123456
)
print('配置后',app.config.get('FLASK_ENV'))
print('配置后',app.config.get('AAAA'))
#------運行結果----------------
配置前 None
配置后 ABC
配置后 123456
通過 json文件 配置app.config:app.config.from_json
settings.json文件內容如下:
{ "FLASK_ENV":"json" }
代碼示例:
from flask import Flask app =Flask(__name__) import os basedir = os.path.abspath(os.path.dirname(__file__)) jsondir =os.path.join(basedir,'settings.json') print('配置前',app.config.get('FLASK_ENV')) #使用 json文件 配置app環境變量
app.config.from_json(jsondir) print('配置后',app.config.get('FLASK_ENV')) #------運行結果----------------
配置前 None 配置后 json
通過 字典 配置app.config: app.config.from_mapping
代碼示例:
from flask import Flask app =Flask(__name__) configDict={ 'FLASK_ENV':'dictConfig' } print('配置前',app.config.get('FLASK_ENV')) #使用 json文件 配置app環境變量
app.config.from_mapping(configDict) print('配置后',app.config.get('FLASK_ENV')) #------運行結果----------------
配置前 None 配置后 dictConfig
通過 python文件 配置app.config:
settings.py文件中內容如下:
py文件中的變量名將作為 app.config配置的key,變量值作為app.config[key]的value
FLASK_ENV='pyConfig'
代碼示例:
from flask import Flask app =Flask(__name__) print('配置前',app.config.get('FLASK_ENV')) #使用 json文件 配置app環境變量
app.config.from_pyfile('settings.py') print('配置后',app.config.get('FLASK_ENV')) #------運行結果----------------
配置前 None 配置后 pyConfig
通過 配置類 配置app.config:
classConfig.py定義了配置類BaseConfig
類中的屬性作為 app.config的key,類中的屬性值作為app.config[key]的value
class BaseConfig(object): FLASK_ENV='objectConfig'
代碼示例:
from flask import Flask app =Flask(__name__) from demoConfig.classConfig import BaseConfig objConfig=BaseConfig() print('配置前',app.config.get('FLASK_ENV')) #使用 json文件 配置app環境變量
app.config.from_object(objConfig) print('配置后',app.config.get('FLASK_ENV')) #------運行結果----------------
配置前 None 配置后 objectConfig