Flask项目配置通过.env环境变量启动开发/生产环境
前言
一般一个项目会配置多套环境:开发/测试/生产环境,每套环境的配置不一样,比如不同的运行环境配置的数据库不一样。
config配置
在前面的配置管理中,已经学会了在config.py 文件写不同环境的配置类
import os class Config(object): # DEBUG = False JSON_AS_ASCII = False # 设置SECRET_KEY SECRET_KEY = os.urandom(24) # 随机字符串 class DevelopmentConfig(Config): """开发环境""" DEBUG = True SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@127.0.0.1:3306/web' # 是否追踪数据库修改,一般不开启, 会影响性能 SQLALCHEMY_TRACK_MODIFICATIONS = False # 是否显示底层执行的SQL语句 SQLALCHEMY_ECHO = True class ProductionConfig(Config): """生产环境""" SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@x.x.x.x:3306/web' # 是否追踪数据库修改,一般不开启, 会影响性能 SQLALCHEMY_TRACK_MODIFICATIONS = False # 是否显示底层执行的SQL语句 SQLALCHEMY_ECHO = False class TestingConfig(Config): """测试环境""" TESTING = True # 映射环境对象 config_env = { 'development': DevelopmentConfig, 'production': ProductionConfig, 'testing': TestingConfig }
apps/__init__.py中写 create_app() 工厂函数
from flask import Flask import os from flask_sqlalchemy import SQLAlchemy from config import config_env from flask_migrate import Migrate db = SQLAlchemy() # 数据库 def create_app(test_config=None): # create and configure the app app = Flask(__name__, instance_relative_config=True) # 从环境配置文件获取当前环境, 没有就拿缺省值"production" env = os.getenv("FLASK_ENV") or "production" print(f'环境变量FLASK_ENV:{os.getenv("FLASK_ENV")}') print(f'config FLASK_ENV = {app.config.get("ENV")}') app.config.from_object(config_env.get(env)) # 获取相应的配置类 # db 数据库初始化 db.init_app(app) # migrate 迁移组件初始化 Migrate(app, db) # app.config.from_mapping( # SECRET_KEY='dev', # DATABASE=os.path.join(app.instance_path, 'apps.sqlite'), # ) # # if test_config is None: # # load the instance config, if it exists, when not testing # app.config.from_pyfile('config.py', silent=True) # else: # # load the test config if passed in # app.config.from_mapping(test_config) # # ensure the instance folder exists try: os.makedirs(app.instance_path) except OSError: pass # 注册蓝图 from . import auth from . import blog app.register_blueprint(auth.bp) app.register_blueprint(blog.bp) return app
命令行启动服务
之前是写一个app.py 文件,通过启动这个文件来启动运行的服务,但是不方便切换运行环境。
我们可以通过命令行启动服务,在启动服务之前,先设置环境变量
Unix Bash ( Linux 、Mac 及其他):
$ export FLASK_APP=apps $ flask run
Windows CMD:
> set FLASK_APP=apps > flask run
Windows PowerShell:
> $env:FLASK_APP = apps > flask run
FLASK_APP是设置我们启动的应用名称,如果项目有app.py 文件或工厂函数( create_app )会被自动探测到, 所以大部分情况这个地方FLASK_APP可以省略。
Flask 应用所运行的环境由 FLASK_ENV 环境变更指定。如果配置该变量, 那么缺省为 production ,另一个可用的环境值是 development 。
以我的电脑windows 系统为例,直接执行flask run
(venv) D:\demo\xuexi_flask>flask run 环境变量FLASK_ENV:None config FLASK_ENV = production * Debug mode: off WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on http://127.0.0.1:5000 Press CTRL+C to quit
可以看到默认启动的ENV 环境变量是production生产环境。
FLASK_ENV 设置启动环境
如果我们想启动一个开发环境,需在启动之前先设置环境变量FLASK_ENV=developmentFLASK_ENV=development
>set FLASK_ENV=development >flask run
运行日志可以看到FLASK_ENV在2.3 版本以后会被弃用,使用'FLASK_DEBUG'代替
>flask run 'FLASK_ENV' is deprecated and will not be used in Flask 2.3. Use 'FLASK_DEBUG' instead. 环境变量FLASK_ENV:development config FLASK_ENV = development 'FLASK_ENV' is deprecated and will not be used in Flask 2.3. Use 'FLASK_DEBUG' instead. 'FLASK_ENV' is deprecated and will not be used in Flask 2.3. Use 'FLASK_DEBUG' instead. * Debug mode: on
于是可以加上'FLASK_DEBUG=True' 重新启动
>set FLASK_ENV=development >set FLASK_ENV=development >flask run
再次启动就可以看到运行日志
>flask run 环境变量FLASK_ENV:development config FLASK_ENV = development * Debug mode: on WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on http://127.0.0.1:5000 Press CTRL+C to quit * Restarting with stat 环境变量FLASK_ENV:development config FLASK_ENV = development * Debugger is active! * Debugger PIN: 132-957-748
启动的是development环境,并且debug模式已经开启。
.env 环境变量管理
在项目的根目录写一个.env 文件,写入配置内容
FLASK_ENV=development FLASK_DEBUG=True
执行flask run会看到一个提示: * Tip: There are .env or .flaskenv files present. Do "pip install python-dotenv" to use them.
需先安装python-dotenv插件
pip install python-dotenv
重新执行flask run 就可以环境变量已经引用成功
环境变量FLASK_ENV:development config FLASK_ENV = development * Debug mode: on
这样只需改.env里面的参数就可以切换development和production环境
通过 dotenv 设置环境变量
与其每次打开新的终端都要设置 FLASK_APP ,不如使用 Flask 的 dotenv 支持 功能自动设置环境变量。
如果 python-dotenv 已安装,那么运行 flask 会根据 .env 和 .flaskenv 中配置来设置环境变量。这样可以在每次打开 终端后,避免手动设置 FLASK_APP 和其他类似使用环境变量进行配置的服务部署 工作。
命令行设置的变量会重载 .env 中的变量, .env 中的变量会重载 .flaskenv 中的变量。 .flaskenv 应当用于公共变量,如 FLASK_APP 而 .env 则应用用于私有变量,并且不提交到储存库。
为了找到定位文件,将会从运行 flask 的文件夹向上扫描文件夹。 当前工作目录将被设置为文件的位置,假定这是最高级别的项目文件夹。
这些文件只能由flask命令或调用 run() 加载。如果想在生产运 行时加载这些文件,你应该手动调用 load_dotenv() 。