在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下载FTP上的文件夹的实现代码
Feb 10 Python
使用Python对MySQL数据操作
Apr 06 Python
python+pyqt实现12306图片验证效果
Oct 25 Python
使用Python快速制作可视化报表的方法
Feb 03 Python
python实现简单日期工具类
Apr 24 Python
Python自定义一个异常类的方法
Jun 27 Python
python网络爬虫 Scrapy中selenium用法详解
Sep 28 Python
python KNN算法实现鸢尾花数据集分类
Oct 24 Python
Python批量启动多线程代码实例
Feb 18 Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
Jul 01 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
Nov 05 Python
使用python将微信image下.dat文件解密为.png的方法
Nov 30 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数组应该有多大的分析
2009/07/30 PHP
PHP设计模式之责任链模式的深入解析
2013/06/13 PHP
PHP实现基于3DES算法加密解密字符串示例
2018/08/24 PHP
用js实现控制内容的向上向下滚动效果
2007/06/26 Javascript
js onload处理html页面加载之后的事件
2013/10/30 Javascript
bootstrap table 服务器端分页例子分享
2015/02/10 Javascript
zepto.js中tap事件阻止冒泡的实现方法
2015/02/12 Javascript
基于jQuery的AJAX和JSON实现纯html数据模板
2016/08/09 Javascript
JavaScript基本类型值-Number类型
2017/02/24 Javascript
微信小程序登录态控制深入分析
2017/04/12 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
老生常谈JS中的继承及实现代码
2018/07/06 Javascript
微信小程序日历/日期选择插件使用方法详解
2018/12/28 Javascript
Elasticsearch实现复合查询高亮结果功能
2019/09/10 Javascript
小程序实现图片移动缩放效果
2020/05/26 Javascript
Js on及addEventListener原理用法区别解析
2020/07/11 Javascript
一则python3的简单爬虫代码
2014/05/26 Python
python删除某个字符
2018/03/19 Python
Python 3.7新功能之dataclass装饰器详解
2018/04/21 Python
redis之django-redis的简单缓存使用
2018/06/07 Python
详解flask入门模板引擎
2018/07/18 Python
django框架自定义模板标签(template tag)操作示例
2019/06/24 Python
Python装饰器结合递归原理解析
2020/07/02 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
2020/12/04 Python
python实现代码审查自动回复消息
2021/02/01 Python
CSS3转换功能transform主要属性值分析及实现分享
2012/05/06 HTML / CSS
html5利用canvas实现颜色容差抠图功能
2019/12/23 HTML / CSS
日本索尼音乐商店:Sony Music Shop
2018/07/17 全球购物
Snapfish爱尔兰:在线照片打印和个性化照片礼品
2018/09/17 全球购物
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
2013/03/30 面试题
化验室技术员岗位职责
2013/12/24 职场文书
团队精神口号
2014/06/06 职场文书
物资采购方案
2014/06/12 职场文书
金融与证券专业求职信
2014/06/22 职场文书
贸易经济专业自荐书
2014/06/29 职场文书
MySQL创建高性能索引的全步骤
2021/05/02 MySQL