使用 Django 存储和 S3 在 collectstatic 上出现 MemcachedError
Posted
技术标签:
【中文标题】使用 Django 存储和 S3 在 collectstatic 上出现 MemcachedError【英文标题】:MemcachedError on collectstatic with Django Storage and S3
【发布时间】:2014-03-31 00:14:46
【问题描述】:
我已经在 Heroku 上部署了一个简单的 Django 应用程序。当我运行collectstatic
将静态文件上传到 S3 时,出现以下错误:
回溯(最近一次通话最后):
文件“appname/manage.py”,第 11 行,在
execute_from_command_line(sys.argv)
文件“/app/.heroku/python/lib/python2.7/site-packages/django/core/management/__init__.py”,第 399 行,在 execute_from_command_line
实用程序.execute()
文件“/app/.heroku/python/lib/python2.7/site-packages/django/core/management/__init__.py”,第392行,在执行
self.fetch_command(子命令).run_from_argv(self.argv)
文件“/app/.heroku/python/lib/python2.7/site-packages/django/core/management/base.py”,第 242 行,在 run_from_argv
self.execute(*args, **options.__dict__)
执行中的文件“/app/.heroku/python/lib/python2.7/site-packages/django/core/management/base.py”,第 285 行
输出 = self.handle(*args, **options)
文件“/app/.heroku/python/lib/python2.7/site-packages/django/core/management/base.py”,第 415 行,在句柄中
返回 self.handle_noargs(**options)
文件“/app/.heroku/python/lib/python2.7/site-packages/collectfast/management/commands/collectstatic.py”,第 135 行,在 handle_noargs
收集 = self.collect()
文件“/app/.heroku/python/lib/python2.7/site-packages/collectfast/management/commands/collectstatic.py”,第 33 行,在 collect
ret = super(Command, self).collect(*args, **kwargs)
文件“/app/.heroku/python/lib/python2.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py”,第111行,收集
处理程序(路径,前缀路径,存储)
文件“/app/.heroku/python/lib/python2.7/site-packages/collectfast/management/commands/collectstatic.py”,第 92 行,在 copy_file
self.destroy_lookup(前缀路径)
文件“/app/.heroku/python/lib/python2.7/site-packages/collectfast/management/commands/collectstatic.py”,第 61 行,在 destroy_lookup
cache.delete(self.get_cache_key(路径))
文件“/app/.heroku/python/lib/python2.7/site-packages/django/core/cache/backends/memcached.py”,第 86 行,删除
self._cache.delete(key)
_pylibmc.MemcachedError:来自 memcached_delete 的错误 47(:1:collectfast_asset_dc44a7965f7):服务器已失败并且已禁用,直到定时重试,主机:127.0.0.1:11211 -> libmemcached/connect.cc:592
在heroku上设置了以下环境变量:
BUILDPACK_URL:
数据库网址:
DJANGO_AWS_ACCESS_KEY_ID:
DJANGO_AWS_SECRET_ACCESS_KEY:
DJANGO_AWS_STORAGE_BUCKET_NAME:
DJANGO_CONFIGURATION:
DJANGO_SECRET_KEY:
HEROKU_POSTGRESQL_CRIMSON_URL:
MEMCACHIER_密码:
MEMCACHIER_SERVERS:
MEMCACHIER_USERNAME:
PGBACKUPS_URL:
发送GRID_PASSWORD:
SENDGRID_USERNAME:
我已经为此苦苦挣扎了几天。昨天,我意识到其中一个 env 变量有一个拼写错误的重复项。删除拼写错误的 env 变量后,collectstatic
命令完美运行,文件上传到 S3。现在我正在使用另一个应用程序,但无法正常工作。
已存在同名的空 S3 存储桶。我已经尝试过用户特定和账户范围的 AWS 凭证,但都没有成功。
【问题讨论】:
【参考方案1】:
我遇到了同样的问题。我已经回复了相关的GitHub issue。
为了完整起见,这里是解决方案:
首先将django-pylibmc-sasl==0.2.4
添加到requirements.txt。
然后在 settings.py 中将文件末尾的“CACHING”部分替换为:
########## CACHING
os.environ['MEMCACHE_SERVERS'] = os.environ.get('MEMCACHIER_SERVERS', '')
os.environ['MEMCACHE_USERNAME'] = os.environ.get('MEMCACHIER_USERNAME', '')
os.environ['MEMCACHE_PASSWORD'] = os.environ.get('MEMCACHIER_PASSWORD', '')
CACHES =
'default':
'BACKEND': 'django_pylibmc.memcached.PyLibMCCache',
'LOCATION': os.environ.get('MEMCACHIER_SERVERS', ''),
'TIMEOUT': 500,
'BINARY': True,
'OPTIONS': 'tcp_nodelay': True
########## END CACHING
它现在应该可以在 Heroku 上正常工作了。
【讨论】:
以上是关于使用 Django 存储和 S3 在 collectstatic 上出现 MemcachedError的主要内容,如果未能解决你的问题,请参考以下文章
如何使用默认文件存储(S3)通过 Django FormTools 表单向导上传文件?
python 使用django存储将下载头(Content-Disposition)添加到存储在s3中的文件
在 Heroku 上使用 Django 将大文件上传到 AWS S3 存储桶而没有 30 秒的请求超时
使用 Amazon S3 静态存储进行静态加载的 django-cms_text_ckeditor 错误
使用 s3 和 django-storages 并上传图片
Django使用S3服务