在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实现发送email的几种常用方法
Aug 18 Python
编写Python CGI脚本的教程
Jun 29 Python
在Django框架中运行Python应用全攻略
Jul 17 Python
Python使用ntplib库同步校准当地时间的方法
Jul 02 Python
python3+PyQt5实现使用剪贴板做复制与粘帖示例
Jan 24 Python
Python递归实现汉诺塔算法示例
Mar 19 Python
Django单元测试中Fixtures用法详解
Feb 25 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
May 03 Python
python使用dlib进行人脸检测和关键点的示例
Dec 05 Python
python实现杨辉三角的几种方法代码实例
Mar 02 Python
python glom模块的使用简介
Apr 13 Python
如何使用pdb进行Python调试
Jun 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
三国漫画《火凤燎原》宣布动画化PV放出 预计2020年播出
2020/03/08 国漫
超小PHP小马小结(方便查找后门的朋友)
2012/05/05 PHP
使用GD库生成带阴影文字的图片
2015/03/27 PHP
JavaScript 继承详解(三)
2009/07/13 Javascript
jquery validator 插件增加日期比较方法
2010/02/21 Javascript
离开页面时检测表单元素是否被修改,提示保存的js代码
2010/08/25 Javascript
js单词形式的运算符
2014/05/06 Javascript
js实现仿Windows风格选项卡和按钮效果实例
2015/05/13 Javascript
javascript中substring()、substr()、slice()的区别
2015/08/30 Javascript
jquery遍历json对象集合详解
2016/05/18 Javascript
Vue.js组件tree实现无限级树形菜单
2016/12/02 Javascript
AngularJS 控制器 controller的详解
2017/10/17 Javascript
vue综合组件间的通信详解
2017/11/06 Javascript
chorme 浏览器记住密码后input黄色背景处理方法(两种)
2017/11/22 Javascript
vue watch普通监听和深度监听实例详解(数组和对象)
2018/08/16 Javascript
vuejs选中当前样式active的实例
2018/08/22 Javascript
Vue.js+cube-ui(Scroll组件)实现类似头条效果的横向滚动导航条
2019/06/24 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
用js编写留言板
2020/03/17 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
2020/06/25 Javascript
vant picker+popup 自定义三级联动案例
2020/11/04 Javascript
Javascript 模拟mvc实现点餐程序案例详解
2020/12/24 Javascript
[10:21]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster 选手采访
2021/03/11 DOTA
python中lambda与def用法对比实例分析
2015/04/30 Python
Python中的hypot()方法使用简介
2015/05/18 Python
python实现校园网自动登录的示例讲解
2018/04/22 Python
使用python编写一个语音朗读闹钟功能的示例代码
2020/07/14 Python
python中字典增加和删除使用方法
2020/09/30 Python
JAKO-O德国野酷台湾站:德国首屈一指的婴幼童用品品牌
2019/01/14 全球购物
Agoda中文官网:安可达(低价预订全球酒店)
2021/01/18 全球购物
介绍一下write命令
2014/08/10 面试题
社团成立邀请函
2014/01/08 职场文书
打架检讨书500字
2014/01/29 职场文书
观看信仰心得体会
2014/09/04 职场文书
求职自荐信范文(优秀篇)
2015/03/27 职场文书
婚宴父母致辞
2015/07/27 职场文书