在Heroku部署Flask项目时遇OSError: [Errno 36]文件名过长问题
问题根源
你犯的核心错误是混淆了环境变量的用途:BIGQUERY_KEY_PATH原本应该指向密钥文件的路径,但你直接把完整的JSON密钥内容赋值给了这个变量。当你的代码尝试将这个变量当作文件路径去读取时,就会把一长串JSON文本当成文件名,自然触发「文件名过长」的错误。
两种解决办法
方法一:直接读取环境变量中的密钥内容(推荐)
修改你的Flask代码,不再把BIGQUERY_KEY_PATH当作文件路径,而是直接读取其中的JSON内容来初始化BigQuery客户端:
from google.cloud import bigquery import os import json # 从Heroku环境变量获取密钥内容 key_json = os.environ.get("BIGQUERY_KEY_PATH") if not key_json: raise ValueError("BIGQUERY_KEY_PATH 环境变量未设置") # 将JSON字符串转为字典 key_data = json.loads(key_json) # 初始化BigQuery客户端 client = bigquery.Client.from_service_account_info(key_data)
这种方式不需要修改你之前的heroku config:set命令,因为现在变量存的就是密钥内容,代码直接使用该内容而非路径。
方法二:将密钥文件打包进项目并设置路径
如果你坚持要使用文件路径的方式:
- 将
bq_key.json放到你的Flask项目目录内(比如创建keys/子目录存放) - 更新Heroku环境变量为项目内的相对路径:
heroku config:set BIGQUERY_KEY_PATH="./keys/bq_key.json" --app app_name
⚠️ 注意:绝对不要把bq_key.json提交到Git仓库,一定要将其添加到.gitignore中。但这样Heroku部署时会缺少该文件,因此你需要用安全的方式传递文件,这种方法不如方法一简便安全。
内容的提问来源于stack exchange,提问作者Geoffrey Rolin Jacquemyns
相关产品推荐
相关产品推荐

