我有一个问题。我想用DRF将文件上传到我的S3存储桶但是当我尝试使用Postman时我收到错误
models.py
class Asset(models.Model):
game = models.ForeignKey(Game, related_name='assets',
on_delete=models.CASCADE)
file_path = models.FileField(upload_to='test', default='')
created_at = models.DateTimeField(auto_now_add=True, blank=True,
null=True)
class Meta:
db_table = 'Asset'
serializers.py
class AssetSerializer(serializers.ModelSerializer):
class Meta:
model = Asset
fields = ('id', 'file_path', 'created_at', 'updated_at')
views.py
class AssetList(generics.ListCreateAPIView):
queryset = Asset.objects.all()
serializer_class = AssetSerializer
permission_classes = (IsAuthenticated,)
parser_classes = (MultiPartParser, )
def perform_create(self, serializer):
serializer.save(game_id=self.kwargs['game_id'])
我在 local_settings.py
中有此功能AWS_ACCESS_KEY_ID = "..."
AWS_SECRET_ACCESS_KEY = "..."
AWS_STORAGE_BUCKET_NAME = "my-bucket-name"
当我这样做:POST / games / 1 / assets /并使用POSTMAN上传文件时,我收到此错误:
File ".env/lib/python2.7/site-
packages/boto/s3/bucket.py", line 232, in _get_key_internal
response.status, response.reason, '')
S3ResponseError: S3ResponseError: 400 Bad Request
感谢您的帮助!
答案 0 :(得分:1)
您可以使用django-storages
。
http://django-storages.readthedocs.org/en/latest/
models.py
def upload_image_to(instance, filename):
import os
from django.utils.timezone import now
filename_base, filename_ext = os.path.splitext(filename)
return 'posts/%s/%s' % (
now().strftime("%Y%m%d"),
instance.id
)
image = models.ImageField(upload_to=upload_image_to, editable=True, null=True, blank=True)
settings.py
DEFAULT_FILE_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 = 'KEY' # enter your access key id
AWS_S3_SECRET_ACCESS_KEY = 'KEY' # enter your secret access key
AWS_STORAGE_BUCKET_NAME = 'name.media'
INSTALLED_APPS = (
...
'storages',
)