如何使用python-dotenv解决代码与敏感信息的分离

目录
  • python-dotenv
  • flask配置最佳实践
  • 总结

“12-Factor” 是构建SaaS服务的一种方法论,这套理论适用于任意语言和后端服务(数据库、消息队列、缓存等)开发的应用程序。

其中有一条很重要的原则是关于配置的, 12-Factor 要求代码和配置严格分离。

为什么要这么做?

如果你的代码放在Github等外部网络,哪一天要是代码不小心泄露了,你的各种密码,密钥,等配置全都暴露于公网中,这是一件非常可怕的事。

判断一个应用是否正确的将配置与代码分离开了,一个简单方法是你的代码是否可以立刻开源,而不用担心有任何敏感信息暴露。

将应用的配置存储于环境变量中是一种常规做法,例如在命令行中加入:

export PASSWORD=123456

windows

set PASSWORD=123456

业务代码中,通过环境变量来加载。

import os
env = os.environ.get("PASSWORD")
print(env)

这样做就不会将敏感信息暴露于业务代码中了,同时也可以最大程度让开发人员接触正式环境的敏感信息。

不过,问题来了,将敏感信息设置成环境变量,如果这样的信息非常多,挨个设置也太麻烦了。

你一定希望可以将这些敏感信息单独放在一个文件中,始终与代码分开管理

例如,我们在一个flask项目中,敏感信息我们专门放在一个叫.flaskenv 的文件中

.flaskenv 文件

FLASK_DEBUG=1
FLASK_ENV=local
AAA=1234

可是这些配置如何加载到环境变量中去?

python-dotenv

python-dotenv 就是专门干这事的,他能将配置文件的配置信息自动加入到环境变量。

安装 python-dotenv

pip install python-dotenv

加载配置文件

from dotenv import load_dotenv
# 加载文件
load_dotenv(".flaskenv")
import os
flask_env = os.environ.get("FLASK_ENV")
print(flask_env) # local

加载文件后,就可以通过os.environ从环境变量中读取内容。

flask配置最佳实践

在flask中,python-dotenv 可以无缝接入项目中,只要你的项目中存在 .env 或者 .flaskenv 文件,他就会提示你是否安装 python-dotenv

$ flask run
 * Tip: There are .env files present. Do "pip install python-dotenv" to use them.

安装完后python-dotenv后,就会自动加载里面的配置文件到环境变量中。

# config.py
class LocalConfig(BaseConfig):
    ENV = "development"
    FLASK_DEBUG = 1
    # 通过变量环境来加载数据库配置
    SQLALCHEMY_DATABASE_URI = os.getenv("SQLALCHEMY_DATABASE_URI")

# app.py
def create_app():
    app = Flask(__name__)
    app.config.from_object(LocalConfig)

# view.py
def hello():
    # 加载环境变量
    os.environ.get("AAA")

你不需要自己去加载配置文件,因为flask-cli 帮你做了这个事,但是生产环境我们通常会基于gunicorn来部署我们的应用,这时候就没法自动加载了。你需要在生成app实例前显式加载配置文件。

#run.py
from app import create_app
from dotenv import load_dotenv
load_dotenv('.flaskenv')
app = create_app()

总结

到此这篇关于如何使用python-dotenv解决代码与敏感信息的分离的文章就介绍到这了,更多相关python-dotenv代码与敏感信息分离内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

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

    最近在重构 flask 项目的时候发现项目的环境变量异常的混乱,非常不便于管理.而且,更重要的事情是我需要通过自定义命令来运行 devlopment 和 production 两种项目环境. 自定义命令工具--flask-cli 在Flask 1.0+ 中已经支持了flask-cli,在翻阅了flask-cli文档之后,发现文档中提供的自定义命令的方法约束还是有点多,而且介绍的也不是特别详细.后来,通过查看flask-cli的源码发现flask-cli是基于Click开发的. Click is

  • 如何使用python-dotenv解决代码与敏感信息的分离

    目录 python-dotenv flask配置最佳实践 总结 “12-Factor” 是构建SaaS服务的一种方法论,这套理论适用于任意语言和后端服务(数据库.消息队列.缓存等)开发的应用程序. 其中有一条很重要的原则是关于配置的, 12-Factor 要求代码和配置严格分离. 为什么要这么做? 如果你的代码放在Github等外部网络,哪一天要是代码不小心泄露了,你的各种密码,密钥,等配置全都暴露于公网中,这是一件非常可怕的事. 判断一个应用是否正确的将配置与代码分离开了,一个简单方法是你的代

  • python优雅实现代码与敏感信息分离的方法

    “12-Factor” 是构建SaaS服务的一种方法论,这套理论适用于任意语言和后端服务(数据库.消息队列.缓存等)开发的应用程序. 其中有一条很重要的原则是关于配置的, 12-Factor 要求代码和配置严格分离. 为什么要这么做? 如果你的代码放在Github等外部网络,哪一天要是代码不小心泄露了,你的各种密码,密钥,等配置全都暴露于公网中,这是一件非常可怕的事. 判断一个应用是否正确的将配置与代码分离开了,一个简单方法是你的代码是否可以立刻开源,而不用担心有任何敏感信息暴露. 将应用的配置

  • python实现对服务器脚本敏感信息的加密解密功能

    背景 在实际项目实施中,会编写很多在服务器执行的作业脚本.程序中凡是涉及到数据库链接.操作系统用户链接.IP地址.主机名称的内容都是敏感信息.在纯内网系统中往因为开发时间紧迫,往往都直接将这些敏感信息明文方式写在脚本中了. 稍微规范一点的,创建一个通用的config文件,将所有这类敏感信息记录在这个文件中,脚本以读取文件方式获取这些信息.这种方式的好处是脚本不用在应用迁移.灾备部署的时候再起不同的版本,尤其是大数据平台作业运行的脚本,如果是需要做灾备集群,这种方式可以减少生产变更时的人工干预操作

  • python 服务器运行代码报错ModuleNotFoundError的解决办法

    一.问题描述 一段 Python 代码在本地的 IDE 上运行正常,部署到服务器运行后,出现了 ModuleNotFoundError: No module named 'xxx' 错误. 二.问题原因 在代码中引入了其他文件的包(自己写的包,非 pip 安装的),问题出在 import 那行语句. 错误的原因是因为路径的原因,服务器端的路径和我们本地的路径不一样显示. 三.解决示例 要解决这个问题,可以在自己代码的顶端加入以下代码: import sys import os sys.path.

  • Python pycharm提交代码遇到冲突解决方法

    目录 一.背景 二.冲突产生原因 三.解决方法 3.1 pycharm误删代码怎么处理 3.2 解决pull --rebase代码冲突 3.3 备份代码 四.重点注意事项 一.背景 我在pycharm提交代码的时候,因为对git和pycharm不是很熟悉,在提交代码到远程仓库遇到冲突后选择应用远端代码导致把本地代码全部删除.之后不知道代码恢复方法,又把代码重新写了一遍,非常浪费时间,导致开发效率低下. 这个问题的相关解决方法在网上比较零碎也不详细,下面我通过自己的实践一步步说明如何解决这个问题.

  • Python实现统计代码行的方法分析

    本文实例讲述了Python实现统计代码行的方法.分享给大家供大家参考,具体如下: 参加光荣之路测试开发班已三月有余,吴总上课也总问" 咱们的课上了这么多次了大家实践了多少行代码了?".这里是一个一脸懵逼的表情.该怎么统计呢?一个个文件数当然不可取,能用代码解决的事咱们坚决不动手.最近在网上刷题时也正好遇到有这么一道题,所以决定撸一撸. 题目:有个目录,里面是你自己写过的程序,统计一下你写过多少行代码.包括空行和注释,但是要分别列出来. 首先分析一下思路捋一下大象装冰箱的步骤,从一个给定

  • 使用Python设计一个代码统计工具

    问题 设计一个程序,用于统计一个项目中的代码行数,包括文件个数,代码行数,注释行数,空行行数.尽量设计灵活一点可以通过输入不同参数来统计不同语言的项目,例如: # type用于指定文件类型 python counter.py --type python 输出: files:10 code_lines:200 comments:100 blanks:20 分析 这是一个看起来很简单,但做起来有点复杂的设计题,我们可以把问题化小,只要能正确统计一个文件的代码行数,那么统计一个目录也不成问题,其中最复

  • python实现全排列代码(回溯、深度优先搜索)

    从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列. 公式:全排列数f(n)=n!(定义0!=1) 1 递归实现全排列(回溯思想) 1.1 思想 举个例子,比如你要对a,b,c三个字符进行全排列,那么它的全排列有abc,acb,bac,bca,cba,cab这六种可能就是当指针指向第一个元素a时,它可以是其本身a(即和自己进行交换),还可以和b,c进行交换,故有3种可能,当第一个元素a确定以后,指针移向第二

  • python装饰器代码深入讲解

    python装饰器就是用于扩展原函数功能的一种函数,这个函数特殊的地方就是它的返回值也是一个函数,使用Python装饰器的一个好处就是:在不需要修改原函数代码的情况下,给函数增加新的功能. 先来看个例子: def say(): print('Nice day') say() # 这个函数的输出为: Nice day 现在,我想在输出Nice day的前面再打印一行****************,类似下面的效果: **************** Nice day 一般情况下,我可以修改上面的代

  • Python如何解决secure_filename对中文不支持问题

    目录 一.最近使用secure_filename发现的问题 二.后面找到了原因 三.解决方案 四.效果展示 前言:最近使用到了secure_filename,然后悲剧的发现中文居然不展示出来,于是我慢慢的debug,终于找到问题了. 一.最近使用secure_filename发现的问题 文件名是中文版的,悲剧的是中文以及其他特殊字符会被省略. 二.后面找到了原因 原来secure_filename()函数只返回ASCII字符,非ASCII字符会被过滤掉. 三.解决方案 找到secure_file

随机推荐