将Google Speech API服务账号JSON加载至Heroku环境变量的问题
解决Heroku设置Google服务账号JSON环境变量的问题
这个问题我之前帮好几个开发者踩过坑——当你直接把带双引号的JSON内容丢进Heroku的config:set命令时,shell会把第一个双引号当成参数的结束标记,直接截断你的JSON,导致设置失败。给你几个简单靠谱的解决方案:
方案1:通过文件内容直接导入(最省心)
不用手动转义任何引号,直接让Heroku读取本地的JSON文件内容:
heroku config:set GOOGLE_APPLICATION_CREDENTIALS="$(cat /path/to/your/service-account.json)"
这个命令会把JSON文件的所有内容作为一个完整的字符串传递给环境变量,完美避开引号解析的问题。
方案2:手动转义JSON里的双引号
如果不想用文件导入,你可以把JSON里的每一个双引号"都换成\",然后用单引号包裹整个JSON字符串:
heroku config:set GOOGLE_APPLICATION_CREDENTIALS='{"type": "service_account", "project_id": "your-project", ...}'
注意要确保整个JSON都被单引号包裹,而且所有内部的双引号都转义了——不过这个方法容易出错,尤其是JSON内容较长的时候,不如方案1方便。
关键:Django代码里的适配
因为本地你是用环境变量指向文件路径,但Heroku上环境变量存的是JSON内容,所以代码里要做一点兼容处理,避免读取失败:
import json import os from google.oauth2 import service_account def get_google_credentials(): creds_value = os.environ.get("GOOGLE_APPLICATION_CREDENTIALS") # 判断是本地的文件路径还是Heroku上的JSON内容 if os.path.isfile(creds_value): # 本地环境:从文件加载凭证 credentials = service_account.Credentials.from_service_account_file(creds_value) else: # Heroku环境:从JSON字符串加载凭证 credentials = service_account.Credentials.from_service_account_info(json.loads(creds_value)) return credentials
之后在调用Google Speech API的时候,用这个函数获取凭证即可。
验证设置是否成功
设置完后可以用下面的命令检查环境变量是否完整:
heroku config:get GOOGLE_APPLICATION_CREDENTIALS
如果输出的是完整的JSON内容,就说明设置成功了。
内容的提问来源于stack exchange,提问作者hulkinBrain
相关产品推荐
相关产品推荐

