Python-dotenv 是一个用于管理环境变量的 Python 库,它通过 .env
文件来存储配置信息,帮助开发者将敏感信息(如 API 密钥、数据库凭证等)与代码分离,从而提高项目的安全性和可移植性。
.env
文件中加载环境变量到应用程序中,避免敏感信息硬编码在代码中。PATH=${ROOT}/bin
的变量引用。首先安装 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}")
load_dotenv(dotenv_path='/path/to/custom.env')
默认情况下,python-dotenv 不会覆盖已经存在的环境变量。可以通过设置 override=True
来覆盖:
load_dotenv(override=True)
可以为环境变量设置默认值:
database_url = os.getenv('DATABASE_URL', 'sqlite:///:memory:')
使用 pydantic 进行类型验证:
from pydantic import BaseSettings
class Settings(BaseSettings):
api_key: str
debug: bool = False
rate_limit: int = 100
class Config:
env_file = ".env"
settings = Settings()
print(settings.api_key)
print(settings.debug)
在 .env
文件中:
ROOT_PATH=/var/www
LOG_DIR=${ROOT_PATH}/logs
CACHE_DIR=${ROOT_PATH}/cache
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'))
echo ".env*" >> .gitignore
echo "!.env.example" >> .gitignore
cp .env .env.example
project-root/
.env.dev # 开发环境
.env.staging # 预发布环境
.env.prod # 生产环境
FROM python:3.10
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY .env.prod .env
COPY . .
CMD ["python", "main.py"]
load_dotenv(override=True)
load_dotenv('/custom/path/.env')
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 中集成 python-dotenv 模块可以方便地管理环境变量,使配置更加安全且易于维护。以下是具体的集成步骤和示例代码:
首先,确保已安装 python-dotenv 模块。可以通过以下命令安装:
pip install python-dotenv
在 Flask 项目的根目录下创建一个名为 .env
的文件,用于存储环境变量。例如:
# .env 文件示例
DATABASE_URL=postgresql://user:password@localhost/mydatabase
SECRET_KEY=your_secret_key
DEBUG=True
注意:
.env
文件通常不提交到版本控制系统(如 Git),因为它可能包含敏感信息。
在 Flask 应用的入口文件(通常是 app.py
或 main.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')
可以设置默认值。
在终端中运行以下命令启动 Flask 应用:
flask run
或者,直接运行 Python 文件:
python app.py
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
文件中的变量。
.env
文件不在项目根目录,需要指定路径,例如:load_dotenv(dotenv_path='/path/to/.env')
.gitignore
文件中添加 .env
,避免将敏感信息提交到版本控制系统中。print(os.getenv('KEY'))
打印环境变量,确保配置正确加载。通过 python-dotenv,Flask 应用可以轻松管理环境变量,避免敏感信息硬编码在代码中,同时支持多环境配置。以上示例展示了基本用法,可以根据实际需求进一步扩展。更多高级用法可参考官方文档或相关教程。