Flask 如何配置多環境
原文地址:https://wxnacy.com/2017/08/15/python-2017-08-15-flask-env-config/
一個完整的web項目都需要配置數據庫連接和開發環境、生產環境靈活切換,今天來在
各個環境中切換數據庫連接
首先添加指定環境腳本
在項目根目錄下創建環境腳本 touch env.sh
並編輯
1 2 3 4 5 6 7 8 9 10 11 |
#!/usr/bin/env bash ENV=$1 if [ ! ${ENV} ] then ENV=local fi export PYTHONPATH=./ # 項目跟目錄 export FLASK_CONFIG=${ENV} # 當前環境 可選 local product dev test |
該文件起到兩個作用
1、PYTHONPATH:項目根目錄。
2、FLASK_CONFIG:當前環境,使用方法
然後執行命令,使配置生效
1 |
$ source env.sh ${env} # env=local|product|dev|test 默認local |
添加環境信息文件
1 2 3 4 |
$ mkdir app $ cd app $ touch local_config.py $ vim local_config.py |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#!/usr/bin/env python # -*- coding: utf-8 -*- '''配置文件程序''' __author__ = "wxnacy([email protected])" __copyright__ = "Copyright of wxnacy (2017)." class ProductionConfig(): DEBUG = False SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:[email protected]:3306/db_name?charset=utf8mb4' class DevelopmentConfig(): DEBUG = True SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:[email protected]:3306/db_name?charset=utf8mb4' class TestingConfig(): DEBUG = True class LocalConfig(): DEBUG = True SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:[email protected]:3306/db_name?charset=utf8mb4' |
該文件配置了各個環境數據庫連接信息
添加文件config.py來根據環境讀取當前環境內容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#!/usr/bin/env python # -*- coding: utf-8 -*- '''配置信息''' __author__ = "wxnacy([email protected])" __copyright__ = "Copyright of wxnacy (2017)." from flask import Flask from werkzeug.contrib.fixers import ProxyFix import os CONFIG_NAME_MAPPER = { 'local': 'app.local_config.LocalConfig', 'product': 'app.local_config.ProductionConfig', 'dev': 'app.local_config.DevelopmentConfig', 'test': 'app.local_config.TestingConfig' } def create_app(flask_config_name=None): """ 創建配置 :return: """ app = Flask(__name__) app.wsgi_app = ProxyFix(app.wsgi_app) env_flask_config_name = os.getenv('FLASK_CONFIG') config_mapper_name = flask_config_name or env_flask_config_name or 'local' config_name = CONFIG_NAME_MAPPER[config_mapper_name] app.config.from_object(config_name) return app app = create_app() |
修改run.py 來讀取環境內容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/usr/bin/env python # -*- coding: utf-8 -*- '''配置信息''' __author__ = "wxnacy([email protected])" __copyright__ = "Copyright of wxnacy (2017)." from app.config import app @app.route('/test') def mysql(): return app.config['SQLALCHEMY_DATABASE_URI'] app.run() |
現在項目的目錄結構爲
1 2 3 4 5 6 |
myproject: app: config.py local_config.py run.py env.sh |
運行
本地環境
1 2 3 4 5 6 7 8 9 |
$ source env.sh $ python run.py $ curl http://localhost:5000/test mysql+pymysql://root:[email protected]:3306/db_name?charset=utf8mb4 $ source env.sh product $ python run.py $ curl http://localhost:5000/test mysql+pymysql://root:[email protected]:3306/db_name?charset=utf8mb4 |