s3桶返回NoneType

1 投票
1 回答
1597 浏览
提问于 2025-04-18 13:19

这和这里的问题完全一样:

无法通过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 设置中包含完整路径。

撰写回答