首页 > 其他分享 >Flask 学习-21. 项目配置通过.env环境变量启动开发/生产环境

Flask 学习-21. 项目配置通过.env环境变量启动开发/生产环境

时间:2022-08-27 22:01:13浏览次数:77  
标签:development 21 env Flask app FLASK ENV flask config

前言

一般一个项目会配置多套环境:开发/测试/生产环境,每套环境的配置不一样,比如不同的运行环境配置的数据库不一样。

config配置

在前面的配置管理中https://www.cnblogs.com/yoyoketang/p/16629630.html,已经学会了在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:[email protected]:3306/web'
    # 是否追踪数据库修改,一般不开启, 会影响性能
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    # 是否显示底层执行的SQL语句
    SQLALCHEMY_ECHO = True


class ProductionConfig(Config):
    """生产环境"""
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:[email protected]: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() 。

标签:development,21,env,Flask,app,FLASK,ENV,flask,config
From: https://www.cnblogs.com/yoyoketang/p/16631599.html

相关文章

  • Envoy 集群故障处理机制
    故障处理机制Envoy提供了一系列开箱即用的故障处理机制;超时(timeout)有限次数的重试,并支持可变的重试延迟主动健康检查与异常探测连接池断路器所有......
  • P7961 [NOIP2021] 数列
    题目描述给定整数\(n,m,k\),和一个长度为\(m+1\)的正整数数组\(v_0,v_1,\ldots,v_m\)。对于一个长度为\(n\),下标从\(1\)开始且每个元素均不超过\(m\)的......
  • luogu P7219 [JOISC2020] 星座 3
    题面传送门实在没东西写了,随便拉一道题凑数。首先看这个东西就感觉只和两个点有关,事实上也是这样。关于最大值的问题肯定要把笛卡尔树建立出来,然后最大值变成两个点的LC......
  • Flask 学习-20. route 路由中的 endpoint 参数
    前言@app.route中的endpoint参数,就相当于django中的name参数,用来反向生成URL。url_for()函数url_for()函数用于构建指定函数的URL。它把函数名称作为第一个参数。......
  • Artlantis studio 2021.2 for Mac(3D渲染工具)
    Artlantisstudio2021forMac是Mac平台上一款专业的3D高级渲染器,artlantismac版专为设计师和建筑师所设计,能够为您快速创建出VR全景,动画和3D透视图等效果。artl......
  • Dreamweaver 2021 for Mac(dw 2021)中文版
    dw2021中文版网页设计终于更新上线了!Dreamweaver 2021mac版是一款为编码设计师提供了更快,更简单的方法来设计的软件,编写和发布在任何尺寸的屏幕上看起来很棒的网站和网络......
  • CCF 202109-2 非零段划分(C++)差分法
    借用岛屿情况来分析这个题。考虑p足够大的情况,所有的数都被海水淹没了,只有0个岛屿。然后,海平面逐渐下降,岛屿数量出现变化。每当一个凸峰出现,岛屿数就会多一个;每当一个凹......
  • 【Virt.Contest】CF1321(div.2)
    第一次打虚拟赛。CF传送门T1:ContestforRobots统计\(r[i]=1\)且\(b[i]=0\)的位数\(t1\)和\(r[i]=0\)且\(b[i]=1\)的位数\(t2\)。两个数都为\(0\)或都为......
  • 【Virt.Contest】CF1215(div.2)
    第二次打虚拟赛。CF传送门T1:YellowCards黄色卡片中规中矩的\(T1\)。首先可以算出一个人也不罚下时发出的最多黄牌数:\(sum=a1*(k1-1)+a2*(k2-1)\)此时,若\(sum>=n......
  • day 21 ajax
    Ajax协议http的协议(基于tcp/ip)请求的类型同步请求(上一个请求没完成不能进行其他操作)<ahref="http://www.baidu.com">去百度</a><ahref="http://www.wobo.com">......