django - django-storages 上传到 S3 关闭服务器,没有错误
问题描述
我正在使用Django 2.x和django-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
解决方案
boto3
在我也为此苦苦挣扎之后,我终于发现添加调试日志非常有用。在Django Shell中,在执行之前m.save()
,请启用boto3
日志:
import boto3
boto3.set_stream_logger('')
这将为您提供django-storages尝试做的大量信息。就我而言,它连接了静态和媒体文件的存储桶。
推荐阅读
- android - Android,直接从扬声器录制/流式传输
- android - Flutter iOS中的匿名身份验证错误
- java - Keycloak Java Adapter 属性“public-client”是什么意思?
- python - 如何在类定义中定义和使用不会成为 Python 中的类变量的变量
- javascript - 使用视频文件 url 从 azure blob 存储下载视频文件时遇到问题
- javascript - 在 MongoDB 中创建嵌套聚合
- android-jetpack-compose - 使用轮廓 Jetpack Compose 创建芯片
- binding - SwiftUI 更新 NavigationLink(destination:label) 中的 @Binding 值导致目的地重新出现
- javascript - 如何在单击时切换具有相同类名的多个元素
- javascript - WEBGL P5js 未将图像显示为纹理