在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 BeautifulSoup设置页面编码的方法
Apr 03 Python
Python脚本在Appium库上对移动应用实现自动化测试
Apr 17 Python
基于python的字节编译详解
Sep 20 Python
python实现log日志的示例代码
Apr 28 Python
python爬虫之urllib3的使用示例
Jul 09 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
Dec 19 Python
python 用下标截取字符串的实例
Dec 25 Python
pandas去重复行并分类汇总的实现方法
Jan 29 Python
python如何读取bin文件并下发串口
Jul 05 Python
Python应用实现处理excel数据过程解析
Jun 19 Python
python 基于opencv 实现一个鼠标绘图小程序
Dec 11 Python
pytorch 中nn.Dropout的使用说明
May 20 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
PHP实现图片简单上传
2006/10/09 PHP
php使用session二维数组实例
2014/11/06 PHP
Yii框架组件的事件机制原理与用法分析
2020/04/07 PHP
语义化 H1 标签
2008/01/14 Javascript
基于jquery的放大镜效果
2012/05/30 Javascript
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
nodejs 整合kindEditor实现图片上传
2015/02/03 NodeJs
javascript制作游戏开发碰撞检测的封装代码
2015/03/31 Javascript
Jquery ui datepicker设置日期范围,如只能隔3天【实现代码】
2016/05/04 Javascript
JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
2016/05/19 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
Javascript 判断两个IP是否在同一网段实例代码
2016/11/28 Javascript
搭建Bootstrap离线文档的方法
2016/12/02 Javascript
js仿小米手机上下滑动效果
2017/02/05 Javascript
JS+html5 canvas实现的简单绘制折线图效果示例
2017/03/13 Javascript
js 图片懒加载的实现
2020/10/21 Javascript
javascript中闭包closure的深入讲解
2021/03/03 Javascript
[00:32]2018DOTA2亚洲邀请赛出场——LGD
2018/04/04 DOTA
python的re模块应用实例
2014/09/26 Python
python内存管理分析
2015/04/08 Python
Python下使用Scrapy爬取网页内容的实例
2018/05/21 Python
python+opencv实现高斯平滑滤波
2020/07/21 Python
浅析PEP570新语法: 只接受位置参数
2019/10/15 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
2021/01/29 Python
python中的unittest框架实例详解
2021/02/05 Python
Lou & Grey美国官网:主打舒适性面料服饰
2017/12/21 全球购物
美国保健品专家:Life Extension
2018/05/04 全球购物
Feelunique德国官方网站:欧洲最大的在线美容零售商
2019/07/20 全球购物
世界上最大的字体市场:MyFonts
2020/01/10 全球购物
如何利用find命令查找文件
2015/02/07 面试题
三分钟自我介绍演讲稿
2014/08/21 职场文书
2014年小学生教师节演讲稿范文
2014/09/10 职场文书
承诺函范文
2015/01/21 职场文书
2015年超市工作总结
2015/04/09 职场文书
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
2021/11/11 Python
win10滚动条自动往上跑怎么办?win10滚动条自动往上跑的解决方法
2022/08/05 数码科技