【发布时间】:2019-12-28 12:57:17
【问题描述】:
我正在使用 Django 2.x 和 django-storages 将媒体文件上传到 S3 存储桶。
我的模型是这样的
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
【问题讨论】:
-
您是否尝试过使用 django 的 shell 上传(用于调试目的)?
-
我试过用 Django 的 shell,检查 Edit 2
-
您是否尝试在运行时创建一些存储桶,如果是,则 AWS_AUTO_CREATE_BUCKET=True 可能是导致错误的原因。您还可以检查您的 IAM 政策
-
不,已经有一个桶了。文件上传较早。它突然停止了。
-
@AnujTBE 尝试使用 utf-8 编码打开文件
标签: django django-storage python-django-storages