使用DRF

时间:2017-09-13 10:32:17

标签: python django amazon-s3 django-rest-framework

我有一个问题。我想用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

感谢您的帮助!

1 个答案:

答案 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',

)