和这里完全一样:Can't collectstatic to s3通过Heroku使用boto - s3桶返回NoneType
这仍然不能解决这个问题。
my 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
在runserver上,collectstatic或从芹菜执行。我得到同样的错误:
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和bucket name的环境变量。有趣的变化
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集成之前,网站工作正常。
从settings.py:
from storages.backends.s3boto import S3BotoStorage
它不需要任何东西,它导致了这个错误。当您导入S3BotoStorage
时,该类将尝试从settings.py中获取桶名和其他设置。为了避免无限导入循环,Python将只允许S3BotoStorage类从settings.py中导入import S3BotoStorage
行之前设置的变量。所有其他变量将显示为None
,其中包括重要的AWS_STORAGE_BUCKET_NAME
设置。
作为旁注,您的桶名设置(AWS_STORAGE_BUCKET_NAME)不应该包含' /
',这在桶名中是不允许的。在这个问题解决后,可能会给您带来其他错误。但是,您可以在S3_URL
设置中包含完整路径。