在flask中使用python-dotenv+flask-cli自定义命令(推荐)


Posted in Python onJanuary 05, 2020

最近在重构 flask 项目的时候发现项目的环境变量异常的混乱,非常不便于管理。而且,更重要的事情是我需要通过自定义命令来运行 devlopment 和 production 两种项目环境。

自定义命令工具——flask-cli

在Flask 1.0+ 中已经支持了flask-cli,在翻阅了flask-cli文档之后,发现文档中提供的自定义命令的方法约束还是有点多,而且介绍的也不是特别详细。后来,通过查看flask-cli的源码发现flask-cli是基于Click开发的。

Click is a Python package for creating beautiful command line interfaces in a composable way with as little code as necessary. It's the “Command Line Interface Creation Kit”. It's highly configurable but comes with sensible defaults out of the box.

Click是一个可以使用简洁代码和组合方法来创建漂亮的命令行命令的Python包。它还是一个高度可配置的,具有合理的默认设置的命令行工具创建工具包。

管理环境变量——python-dotenv

在使用flask-cli的时候,为了不需要每次都在 flask run 之前都引入环境变量。官方文档中提了 python-dotenv ,需要在项目中创建 .env 和 .flaskenv 两个文件。

命令行设置的变量会重载 .env 中的变量, .env 中的变量会重载 .flaskenv 中的变量。 .flaskenv 应当用于公共变量,如 FLASK_APP 而 .env 则应用用于私有变量,并且不提交到储存库。

在使用 python-dotenv 之前还需要通过 pip 去安装依赖包(我这里使用的 pipenv ):

pipenv install python-dotenv

在 .env 文件中一般写一些私有变量或者是涉及到隐私的变量,即使不上传到 git 上也不影响程序运行的这种。

下面以 .flaskenv 中的几个变量为例:

# .flaskenv
FLASK_APP = "app"
FLASK_ENV = "development"
FLASK_RUN_HOST = '0.0.0.0'
FLASK_RUN_PORT = '5000'

读取环境变量

这里介绍如何在项目读取变量的方法:

import os
from dotenv import load_dotenv
# 加载环境变量文件,dotenv_path默认值为.env,override是表示是否可以重载,默认值为False
load_dotenv(dotenv_path='.flaskenv',override=True)
# 读取环境变量 FLASK_ENV,通过os.getenv()方法中引入字段名称来读取
env = os.getenv("FLASK_ENV")
print(env)

自定义命令

这里我的项目的入口文件为 app.py

# app.py
import click
import os
from os.path import dirname,join
from dotenv import load_dotenv
# 加载变量文件
load_dotenv(dotenv_path='.flaskenv')

'''
下面这一段代码是根据在命令行中传入的dev的值来执行不同的命令,从而达到一个命令区分开发环境和生产环境
'''
@click.command()
@click.option('--dev', default=os.getenv("FLASK_ENV"),help='environment variable')
def runserver(dev):
 os.system("FLASK_ENV=%s flask run" % (dev))

if __name__ == '__main__':
 runserver()

运行代码:

# 开发环境
python app.py
或者
python app.py --dev=development
# 生产环境
python app.py --dev=production

目前,第一阶段就做了这么多,其中还有很多不足之处,希望大家帮忙提出点意见,后续我有更多的做法,也会第一时间更新这些内容。

总结

以上所述是小编给大家介绍的在flask中使用python-dotenv+flask-cli自定义命令,希望对大家有所帮助!

Python 相关文章推荐
使用python搭建Django应用程序步骤及版本冲突问题解决
Nov 19 Python
跟老齐学Python之变量和参数
Oct 10 Python
python操作字典类型的常用方法(推荐)
May 16 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
Sep 18 Python
python pandas实现excel转为html格式的方法
Oct 23 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
Jun 19 Python
PyTorch的深度学习入门教程之构建神经网络
Jun 27 Python
python对矩阵进行转置的2种处理方法
Jul 17 Python
用Python从0开始实现一个中文拼音输入法的思路详解
Jul 20 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
Dec 02 Python
pandas统计重复值次数的方法实现
Feb 20 Python
OpenCV实现常见的四种图像几何变换
Apr 01 Python
通过 Python 和 OpenCV 实现目标数量监控
Jan 05 #Python
python中count函数简单用法
Jan 05 #Python
Python猴子补丁知识点总结
Jan 05 #Python
Python调用Windows API函数编写录音机和音乐播放器功能
Jan 05 #Python
django ajax发送post请求的两种方法
Jan 05 #Python
关于tensorflow的几种参数初始化方法小结
Jan 04 #Python
基于TensorFlow常量、序列以及随机值生成实例
Jan 04 #Python
You might like
关于时间计算的结总
2006/12/06 PHP
php随机输出名人名言的代码
2012/10/07 PHP
ThinkPHP3.1新特性之命名范围的使用
2014/06/19 PHP
PHP实现绘制3D扇形统计图及图片缩放实例
2014/10/01 PHP
Windows 下安装 swoole 图文教程(php)
2017/06/05 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
2020/05/02 PHP
Javascript中的for in循环和hasOwnProperty结合使用
2013/06/05 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
jquery实现select选中行、列合计示例
2014/04/25 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
2015/01/28 Javascript
jQuery实现感应鼠标动画效果自动伸长的输入框实例
2015/02/24 Javascript
JavaScript之数组(Array)详解
2015/04/01 Javascript
Angular中实现树形结构视图实例代码
2017/05/05 Javascript
AngularJS的ng-click传参的方法
2017/06/19 Javascript
vue2.0 axios前后端数据处理实例代码
2017/06/30 Javascript
微信小程序模板template简单用法示例
2018/12/04 Javascript
微信小程序五子棋游戏的悔棋实现方法【附demo源码下载】
2019/02/20 Javascript
使用VueCli3+TypeScript+Vuex一步步构建todoList的方法
2019/07/25 Javascript
vuex实现数据状态持久化
2019/11/11 Javascript
利用js实现简易红绿灯
2020/10/15 Javascript
python编程通过蒙特卡洛法计算定积分详解
2017/12/13 Python
python3如何将docx转换成pdf文件
2018/03/23 Python
python批量读取txt文件为DataFrame的方法
2018/04/03 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
2018/12/14 Python
Tensorflow读取并输出已保存模型的权重数值方式
2020/01/04 Python
python通过移动端访问查看电脑界面
2020/01/06 Python
解决python运行效率不高的问题
2020/07/20 Python
详解python的xlwings库读写excel操作总结
2021/02/26 Python
html如何对span设置宽度
2019/10/30 HTML / CSS
创业计划书怎样才能打动风投
2014/01/01 职场文书
医院学雷锋活动策划方案
2014/02/15 职场文书
运动会闭幕式解说词
2014/02/21 职场文书
舞蹈教育学专业自荐信
2014/06/15 职场文书
寒假安全保证书
2015/02/28 职场文书
医院员工辞职信范文
2015/05/12 职场文书
导游词之河北滦平金山岭长城
2019/10/16 职场文书