当前位置: 首页 > news >正文

【Python 】dotenv 模块与用法介绍及Flask 集成用法示例

dotenv 模块介绍与用法

Python-dotenv 是一个用于管理环境变量的 Python 库,它通过 .env 文件来存储配置信息,帮助开发者将敏感信息(如 API 密钥、数据库凭证等)与代码分离,从而提高项目的安全性和可移植性。

核心功能与优势

  1. 环境变量管理:从 .env 文件中加载环境变量到应用程序中,避免敏感信息硬编码在代码中。
  2. 多环境支持:可以轻松切换开发/测试/生产环境配置。
  3. 类型自动转换:支持字符串到数字/布尔值的自动转换。
  4. 嵌套变量解析:支持类似 PATH=${ROOT}/bin 的变量引用。
  5. 框架集成:与 Flask、Django、FastAPI 等主流框架无缝协作。

安装与基本配置

首先安装 python-dotenv:

pip install python-dotenv

然后在项目根目录创建 .env 文件,内容格式为 KEY=VALUE

DEBUG=True
DB_HOST=localhost
DB_PORT=5432
SECRET_KEY=supersecretkey

基本使用方法

from dotenv import load_dotenv
import os
# 加载.env文件
load_dotenv()
# 访问环境变量
debug_mode = os.getenv('DEBUG')  # 输出: True
db_host = os.getenv('DB_HOST')   # 输出: localhost
db_port = os.getenv('DB_PORT')   # 输出: 5432
print(f"Debug Mode: {debug_mode}")
print(f"Database Host: {db_host}:{db_port}")

多环境配置示例

可以根据环境变量加载不同的配置文件:

import os
from dotenv import load_dotenv
# 根据环境变量确定加载哪个配置文件
env = os.getenv('ENV', 'dev')  # 默认使用开发环境
load_dotenv(f'.env.{env}')     # 加载 .env.dev 或 .env.prod
# 使用配置
debug_mode = os.getenv('DEBUG')
db_host = os.getenv('DB_HOST')
print(f"Environment: {env}, Debug: {debug_mode}, DB Host: {db_host}")

高级用法

1. 指定 .env 文件路径

load_dotenv(dotenv_path='/path/to/custom.env')

2. 覆盖现有环境变量

默认情况下,python-dotenv 不会覆盖已经存在的环境变量。可以通过设置 override=True 来覆盖:

load_dotenv(override=True)

3. 处理默认值

可以为环境变量设置默认值:

database_url = os.getenv('DATABASE_URL', 'sqlite:///:memory:')

4. 类型安全与验证

使用 pydantic 进行类型验证:

from pydantic import BaseSettings
class Settings(BaseSettings):api_key: strdebug: bool = Falserate_limit: int = 100class Config:env_file = ".env"
settings = Settings()
print(settings.api_key)
print(settings.debug)

5. 嵌套变量解析

.env 文件中:

ROOT_PATH=/var/www
LOG_DIR=${ROOT_PATH}/logs
CACHE_DIR=${ROOT_PATH}/cache

6. 动态加载配置

from dotenv import dotenv_values
class Config:def __init__(self):self.config = {**dotenv_values(".env.base"),    # 基础配置**dotenv_values(".env.secret"),  # 密钥配置**os.environ                    # 系统环境变量}def get(self, key):return self.config.get(key)
config = Config()
print(config.get('DATABASE_URL'))

安全最佳实践

  1. 避免提交 .env 文件到版本控制
    echo ".env*" >> .gitignore
    echo "!.env.example" >> .gitignore
    
  2. 创建配置模板
    cp .env .env.example
    
  3. 多环境部署架构
    project-root/.env.dev        # 开发环境.env.staging    # 预发布环境.env.prod       # 生产环境
    
  4. 与 Docker 集成
    FROM python:3.10
    WORKDIR /app
    COPY requirements.txt .
    RUN pip install -r requirements.txt
    COPY .env.prod .env
    COPY . .
    CMD ["python", "main.py"]
    

常见问题与解决方案

  1. 变量未生效
    • 强制覆盖现有环境变量:load_dotenv(override=True)
    • 检查文件路径:load_dotenv('/custom/path/.env')
  2. Flask 项目无法启动
    • 避免在项目根目录创建 .env 文件,正确位置应在应用目录内。
  3. Docker 部署问题
    • 使用构建参数传递敏感信息:
      FROM python:3.9
      ARG DB_PASS
      ENV DB_PASS=${DB_PASS}
      COPY requirements.txt .
      RUN pip install -r requirements.txt
      COPY . .
      CMD ["python", "app.py"]
      
    • 构建时传递参数:
      docker build --build-arg DB_PASS=my_secret -t myapp .
      

Flask 集成

在 Flask 中集成 python-dotenv 模块可以方便地管理环境变量,使配置更加安全且易于维护。以下是具体的集成步骤和示例代码:


1. 安装 python-dotenv

首先,确保已安装 python-dotenv 模块。可以通过以下命令安装:

pip install python-dotenv

2. 创建 .env 文件

在 Flask 项目的根目录下创建一个名为 .env 的文件,用于存储环境变量。例如:

# .env 文件示例
DATABASE_URL=postgresql://user:password@localhost/mydatabase
SECRET_KEY=your_secret_key
DEBUG=True

注意:.env 文件通常不提交到版本控制系统(如 Git),因为它可能包含敏感信息。


3. 在 Flask 中加载 .env 文件

在 Flask 应用的入口文件(通常是 app.pymain.py)中,使用 python-dotenv 加载 .env 文件,并读取环境变量。以下是一个完整的示例:

# app.py
from flask import Flask
from dotenv import load_dotenv
import os
# 加载 .env 文件中的环境变量
load_dotenv()
app = Flask(__name__)
# 从环境变量中读取配置
app.config['DATABASE_URL'] = os.getenv('DATABASE_URL')
app.config['SECRET_KEY'] = os.getenv('SECRET_KEY')
app.config['DEBUG'] = os.getenv('DEBUG', 'False').lower() == 'true'
@app.route('/')
def hello():return f"Hello, World! Debug mode: {app.config['DEBUG']}"
if __name__ == '__main__':app.run()

说明

  • load_dotenv() 会自动加载项目根目录下的 .env 文件。
  • os.getenv('KEY') 用于从环境变量中读取值,如果变量不存在,则返回 None
  • 通过 os.getenv('KEY', 'default_value') 可以设置默认值。

4. 启动 Flask 应用

在终端中运行以下命令启动 Flask 应用:

flask run

或者,直接运行 Python 文件:

python app.py

5. 高级用法:区分开发与生产环境

Flask 支持通过环境变量 FLASK_ENV 区分开发环境和生产环境。可以在 .env 文件中设置:

# .env 文件
FLASK_ENV=development

在代码中,可以根据环境变量动态加载不同的配置:

if os.getenv('FLASK_ENV') == 'development':app.config['DEBUG'] = True
else:app.config['DEBUG'] = False

提示:Flask 默认支持从 .env.flaskenv 文件加载环境变量,优先级为:手动设置的环境变量 > .env 文件中的变量 > .flaskenv 文件中的变量。


6. 避免常见问题

  • 确保文件路径正确:如果 .env 文件不在项目根目录,需要指定路径,例如:
    load_dotenv(dotenv_path='/path/to/.env')
    
  • 避免提交敏感信息:在 .gitignore 文件中添加 .env,避免将敏感信息提交到版本控制系统中。
  • 检查环境变量是否生效:可以通过 print(os.getenv('KEY')) 打印环境变量,确保配置正确加载。

总结

通过 python-dotenv,Flask 应用可以轻松管理环境变量,避免敏感信息硬编码在代码中,同时支持多环境配置。以上示例展示了基本用法,可以根据实际需求进一步扩展。更多高级用法可参考官方文档或相关教程。

http://www.dtcms.com/a/290446.html

相关文章:

  • 力扣-45.跳跃游戏II
  • 解决mac chrome无法打开本地网络中的内网网址的问题
  • 【HTML】图片比例和外部div比例不一致,最大程度占满
  • CSS实现背景色下移10px
  • 网络协议(四)网络层 路由协议
  • Vue组件之间通信
  • 使用相机不同曝光时间测试灯光闪烁频率及Ai解释
  • 【Java + Vue 实现图片上传后 导出图片及Excel 并压缩为zip压缩包】
  • 过往记录系列 篇七:大A突破3500点历史梳理
  • STM32 USB键盘实现指南
  • 格式工厂5.21.0简介
  • Idea上拉取代码解决冲突的总结
  • Scott Brinker:Martech代理时代兴起,结构性的洗牌刚刚开始;SaaS定价模式迅速被按效果付费所取代
  • 时序数据库在工业物联网领域的核心优势与应用价值
  • mongodb源代码分析createCollection命令由create.idl变成create_gen.cpp过程
  • MongoDB 查询时区问题
  • MySQL主从同步集群(Docker搭建)
  • 安装docker可视化工具 Portainer中文版(ubuntu上演示,所有docker通用) 支持控制各种容器,容器操作简单化 降低容器门槛
  • 详解 F.cross_entropy 与标签平滑的工作原理
  • MySQL(05) mysql锁,MVCC、Innodb行锁
  • 【初识Qt】
  • node.js 为什么要装 express组件
  • 如何使用电脑连接小米耳机(红米 redmi耳机)
  • HTTP,HTTPS
  • uniapp【uni-ui】【vue3】样式覆盖方式记录
  • uniapp vue3 vite项目使用微信云开发(云函数)
  • 全新开发范式:uni-app X助力全平台原生应用
  • uni-app 鸿蒙平台条件编译指南
  • 基于FPGA的IIC控制AHT20读取温湿度
  • 查看两个tv and 手机模拟器的ip