Python中使用.env存储API密钥报AttributeError的解决方法
问题排查与解决方案
问题本质
代码报错AttributeError: 'str' object has no attribute 'items'的核心原因:
.env文件的内容会被os.getenv()读取为字符串类型,而非Python字典。你原.env中写的Python字典语法headers={...},读出来后是一段包含字典代码的字符串,不是真正的字典对象。requests.request()的headers参数要求传入字典类型,内部会调用字典的items()方法处理键值对,字符串没有该方法,因此触发报错。
修正方案(推荐第一种)
方案1:单独存储API密钥(更规范)
这种方式避免解析字符串的麻烦,也便于单独管理密钥:
- 修改
.env文件内容,仅存储API密钥:
X_API_KEY=sLEW68I3862.......75NKanjI
- 修改Python脚本,读取密钥后手动构建headers字典:
import requests from dotenv import load_dotenv import os load_dotenv() url = "https://yfapi.net/v6/finance/quote" # 读取密钥并构建headers字典 api_key = os.getenv('X_API_KEY') headers = {'x-api-key': api_key} print(f'headers is: {headers}') ticker_List = ("AAPL", "AMZN", "F", "T") for ticker in ticker_List: querystring = {"symbols": ticker} response = requests.request("GET", url=url, headers=headers, params=querystring) print(response.text) print("________________") print()
方案2:存储完整headers字符串并解析(备选,不推荐)
如果非要在.env中存储完整headers结构,可采用JSON格式存储后解析为字典:
- 修改
.env为JSON格式字符串:
HEADERS={"x-api-key":"sLEW68I3862.......75NKanjI"}
- 修改Python脚本,用
json.loads()解析字符串为字典:
import requests from dotenv import load_dotenv import os import json load_dotenv() url = "https://yfapi.net/v6/finance/quote" # 读取JSON字符串并转换为字典 headers_str = os.getenv('HEADERS') headers = json.loads(headers_str) print(f'headers is: {headers}') ticker_List = ("AAPL", "AMZN", "F", "T") for ticker in ticker_List: querystring = {"symbols": ticker} response = requests.request("GET", url=url, headers=headers, params=querystring) print(response.text) print("________________") print()
注意事项
.env是简单键值对格式,不要写入Python代码语法(如字典的{})。- 务必将
.env添加到版本控制忽略列表(如.gitignore),防止密钥泄露。
内容的提问来源于stack exchange,提问作者Terry
相关产品推荐
相关产品推荐

