首页 > 解决方案 > django-storages 上传到 S3 关闭服务器,没有错误

问题描述

我正在使用Django 2.xdjango-storages将媒体文件上传到S3 Bucket

我的模型就像

class Media(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True, default=None)
    file = models.FileField(upload_to=get_media_upload_path)

Django 设置有

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
AWS_STORAGE_BUCKET_NAME = os.environ.get('S3_STORAGE', 'test-bucket')
AWS_DEFAULT_ACL = 'public-read'

并且环境变量设置为

AWS_ACCESS_KEY_ID=my-key
AWS_SECRET_ACCESS_KEY=my-secret

当我从邮递员上传文件时,它会关闭服务器而没有任何错误。

我尝试调试 DRF Serializer 的保存方法

def save(self, **kwargs):
    log.info('Saving with kwargs: {}'.format(kwargs))
    new = super().save(**kwargs)
    log.info('Saved: {}'.format(new))
    return new

它打印第一行,但在该super().save()行之后没有输出。

从设置文件中删除django-storages配置工作正常,并在本地目录中上传文件。

编辑 2:从 Django shell 上传

使用以下命令从 Django shell 上传

file = File(open('/path/to/file'))
m = Media(user=user, file=file)
m.save()

给出错误

File "/home/scanova/.virtualenvs/qcg-TqOLHEIu/lib/python3.7/site-packages/s3transfer/upload.py", line 86, in read
   return self._fileobj.read(amount)
File "/home/scanova/.virtualenvs/qcg-TqOLHEIu/lib/python3.7/codecs.py", line 322, in decode
   (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc7 in position 10: invalid continuation byte

标签: djangodjango-storagepython-django-storages

解决方案


boto3在我也为此苦苦挣扎之后,我终于发现添加调试日志非常有用。在Django Shell中,在执行之前m.save(),请启用boto3日志:

import boto3
boto3.set_stream_logger('')

这将为您提供django-storages尝试做的大量信息。就我而言,它连接了静态和媒体文件的存储桶。


推荐阅读