我有一个非常奇怪的问题。
我让我的django项目在Heroku中运行,使用S3来存储我的静态资产。
我想通过如下设置Heroku环境变量来使用它们:
heroku config:add AWS_S3_TOKEN=my_s3_token
heroku config:add AWS_S3_SECRET=my_s3_secret
将它们与python的os模块一起使用:
import os
token = os.getenv('AWS_S3_TOKEN')
secret = os.getenv('AWS_S3_SECRET')
但是heroku不断向我发出以下错误:
NoAuthHandlerFound: No handler was ready to authenticate. 1 handlers were checked. ['HmacAuthV1Handler'] Check your credentials
所以,我最终在我的settings.py文件中写了这些参数,它工作正常
为什么会这样?
如果我跑
heroku config
我可以看到我所有的变量,如果我这样做
heroku run python manage.py shell
然后
import os
print os.getenv('AWS_S3_TOKEN')
例如,它打印变量的值。
有关这个的任何线索???
提前谢谢
答案 0 :(得分:1)
我不熟悉python或Django,但我很好奇。
如果您尝试使用空白字符串进行身份验证,是否会出现相同的错误?
如果是这样,那么我怀疑它是当你正在进行这种认证舞蹈时。你什么时候做的?在编译时,还是在运行时? (如果在编译时,请查看this)
答案 1 :(得分:0)
当Heroku编译slug并设置应用程序时,应用程序的环境变量通常不可用,它们仅在应用程序运行时才可用。对于Django应用程序,Heroku将运行collectstatic
作为slug编译的一部分,这可能是您看到此错误的原因。
您可以通过启用Heroku Labs功能在编译期间使环境变量可用:
heroku labs:enable user-env-compile
此Heroku开发中心文章中提供了更多信息:https://devcenter.heroku.com/articles/labs-user-env-compile