s3桶返回NoneType
这和这里的问题完全一样:
无法通过Heroku使用boto将静态文件收集到s3 - s3桶返回NoneType
不过,这个方法还是没能解决我的问题。
我settings.py文件中重要的部分是:
from base64 import b64decode
from storages.backends.s3boto import S3BotoStorage
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_S3_SECURE_URLS = False # use http instead of https
AWS_QUERYSTRING_AUTH = False # don't add complex authentication-related query parameters for requests
AWS_S3_ACCESS_KEY_ID = <snip> # enter your access key id
AWS_S3_SECRET_ACCESS_KEY = <snip> # enter your secret
AWS_STORAGE_BUCKET_NAME = 'mybucket/images/'
S3_URL = 'http://%s.s3.amazonaws.com/' % AWS_STORAGE_BUCKET_NAME
STATIC_URL = S3_URL
在运行服务器、收集静态文件或者从celery执行时,我遇到的错误都是一样的:
File "/virtualenv/path/to/site-package/boto/s3/connection.py", line 94, in build_auth_path
path = '/' + bucket
TypeError: cannot concatenate 'str' and 'NoneType' objects
环境变量已经设置好了,包括keyid、access key和桶的名字。有趣的是,改变
S3_URL = 'http://%s.s3.amazonaws.com/' % AWS_STORAGE_BUCKET_NAME
为
S3_URL = 'http://%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
会导致一个更奇怪的错误:
from django.db.models import signals, sql
ImportError: cannot import name signals
在我尝试这个s3集成之前,网站其他部分都运行得很好。
1 个回答
1
从你的 settings.py 文件中删除这一行:
from storages.backends.s3boto import S3BotoStorage
这行代码其实没什么用,而且还导致了错误。当你导入 S3BotoStorage
时,这个类会尝试从 settings.py 中获取桶的名称和其他设置。为了避免无限循环导入,Python 只允许 S3BotoStorage
类导入在 import S3BotoStorage
这一行之前设置的变量。其他的变量会显示为 None
,这就包括了那个很重要的 AWS_STORAGE_BUCKET_NAME
设置。
另外,你的桶名称设置 (AWS_STORAGE_BUCKET_NAME) 中不能包含 '/
',因为桶名称中是不允许有这个符号的。这样可能会在修复这个错误后导致其他问题。不过,你可以在你的 S3_URL
设置中包含完整路径。