load_dotenv()详解

该文章已生成可运行项目,

`load_dotenv()` 是 Python 库 `python-dotenv` 的核心函数,用于从 `.env` 文件加载环境变量到当前运行环境中。以下是其核心含义和功能解析:

---

**1. 基本作用**


• 环境变量加载  

  `load_dotenv()` 会从项目根目录的 `.env` 文件(默认路径)中读取键值对,并将这些变量注入到 Python 的运行时环境变量(即 `os.environ`)中。  
  • 示例:若 `.env` 文件包含 `API_KEY=123`,调用后可通过 `os.getenv("API_KEY")` 获取值 `"123"`。


• 敏感信息管理  

  避免在代码中硬编码敏感信息(如数据库密码、API 密钥),提升安全性。

---

**2. 核心特性**


**2.1 路径与覆盖规则**
• 默认路径:自动搜索当前目录及其父目录下的 `.env` 文件。

• 自定义路径:可通过 `dotenv_path` 参数指定其他路径(如 `load_dotenv(dotenv_path="/path/to/.env")`)。

• 覆盖行为:  

  • 默认不覆盖已存在的系统变量,但可通过 `override=True` 强制覆盖。  

  • 优先级:系统变量 > `.env` 变量(默认)→ 若需优先使用 `.env` 变量,需设置 `override=True`。


**2.2 多环境支持**
• 场景:开发、测试、生产环境使用不同的配置文件(如 `.env.dev`、`.env.prod`)。  

• 实现方式:  

  ```python
  env_file = ".env.prod" if is_production else ".env.dev"
  load_dotenv(env_file)
  ```

**2.3 错误处理与调试**
• 静默失败:若 `.env` 文件不存在,默认不报错,但可通过 `verbose=True` 输出警告。

• 手动检查:  

  ```python
  from pathlib import Path
  if Path(".env").exists():
      load_dotenv()
  ```

---

**3. 使用场景**


| 场景                  | 实现方式                                                                 | 优势                              |
|-----------------------|------------------------------------------------------------------------|---------------------------------|
| Web 框架配置       | 在 Django/Flask 中加载数据库 URL、密钥等                    | 避免配置泄露,提升可移植性            |
| 跨平台开发         | 统一不同系统的路径格式(如 `DATA_PATH=/opt/data`)               | 代码无需适配操作系统差异              |
| API 密钥管理       | 从 `.env` 读取密钥,代码中通过 `os.getenv` 调用             | 安全隔离敏感信息                      |
| 多团队协作         | 提供 `.env.example` 模板,开发者复制后填写实际值                | 防止遗漏关键配置项                    |

---

**4. 高级用法**


• 不污染系统变量:  

  使用 `dotenv_values(".env")` 返回字典而不修改 `os.environ`。
• 变量插值:  

  支持引用其他变量(如 `DOMAIN=example.org` → `EMAIL=admin@${DOMAIN}`)。
• 动态修改环境变量:  

  ```python
  load_dotenv()
  os.environ["NEW_KEY"] = "new_value"  # 手动修改变量
  ```

---

**5. 常见问题**


• `os.getenv()` 返回 `None` 的可能原因:  

  1. `.env` 文件未加载(路径错误或未调用 `load_dotenv()`)。  
  2. 变量名拼写错误或未设置默认值(如 `os.getenv("KEY", "default")`)。

---

**总结**


`load_dotenv()` 是连接 `.env` 文件与 Python 运行时环境的核心工具,通过动态加载配置实现安全、灵活的多环境管理。其设计兼顾开发便捷性与生产环境适配性,是现代 Python 项目的标配。

本文章已经生成可运行项目
# app.py import os from flask import Flask, request, jsonify, render_template import requests from langchain.vectorstores import FAISS from langchain.embeddings import HuggingFaceEmbeddings from dotenv import load_dotenv # 加载环境变量 load_dotenv() app = Flask(__name__) ZHIPU_API_KEY = os.getenv("ZHIPU_API_KEY") # ✅ 正确获取 API Key API_URL = "https://open.bigmodel.cn/api/paas/v4/chat/completions" # 初始化向量数据库 EMBEDDINGS = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh-v1.5") try: DB = FAISS.load_local("vectorstore", EMBEDDINGS, allow_dangerous_deserialization=True) print("✅ 成功加载向量数据库") except Exception as e: DB = None print(f"❌ 无法加载向量数据库: {e},请先运行 ingest.py") # 固定系统提示词(System Prompt),限定财务领域 SYSTEM_PROMPT = """ 你是一个大学财务处的智能助手,请根据提供的背景信息准确回答问题。 只允许依据所给内容作答,禁止编造数据。 如果信息不足,请说明“根据现有资料无法确定”。 回答要正式、清晰、有条理。 """ @app.route("/") def index(): return render_template("index.html") @app.route("/ask", methods=["POST"]) def ask(): user_input = request.json.get("question", "").strip() if not user_input: return jsonify({"answer": "请输入您的问题。"}) # ======== RAG 检索相关文档片段 ======== if DB is None: return jsonify({"answer": "知识库未加载,请检查 vectorstore/ 是否存在或重新运行 ingest.py"}), 500 relevant_docs = DB.similarity_search(user_input, k=3) context = "\n\n".join([d.page_content.strip() for d in relevant_docs]) # ======== 构造带上下文的 prompt ======== full_prompt = f""" 【参考信息】 {context} 【用户问题】 {user_input} 请结合以上信息作答: """ # ======== 调用智谱 GLM 接口 ======== headers = { "Authorization": f"Bearer {ZHIPU_API_KEY}", # ✅ 正确使用 API Key "Content-Type": "application/json" } payload = { "model": "glm-4", "messages": [ {"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": full_prompt} ], "temperature": 0.4, "max_tokens": 600 } try: response = requests.post(API_URL, json=payload, headers=headers, timeout=15) if response.status_code == 200: data = response.json() answer = data["choices"][0]["message"]["content"].strip() return jsonify({"answer": answer}) else: error_msg = response.json().get("error", {}).get("message", "未知错误") return jsonify({"answer": f"【AI 调用失败】{error_msg}"}), 500 except Exception as e: return jsonify({"answer": f"【请求异常】{str(e)}"}), 500 if __name__ == "__main__": app.run(debug=True)
09-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值