使用RESTAPI上传图像

时间:2016-02-29 10:05:20

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

我正在使用Django Rest Framework处理应用程序。

models.py

SELECT HEX(col) FROM tbl

serializers.py

class Image(models.Model):
    image_meta = models.ForeignKey('Image_Meta',on_delete=models.CASCADE,)
    image_path = models.URLField(max_length=200)
    order = models.IntegerField()
    version = models.CharField(max_length=10)

views.py

class ImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Image
        field = ('id', 'image_path' , 'order' , 'version')

网址格式

class ImageList(generics.ListCreateAPIView):
    queryset = Image.objects.all()
    serializer_class = ImageSerializer

class ImageDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Image.objects.all()
    serializer_class = ImageSerializer

这只是整个系统的一部分。 我想使用RESTAPI上传图片,然后将其上传到亚马逊s3,然后从那里获取网址并将其存储在模型图片的 image_path 字段中。我见过以前使用REST(like this)上传文件的解决方案,但对我的案例没有任何作用。有人可以建议我该怎么做?

2 个答案:

答案 0 :(得分:0)

我们知道使用multipart/form-data上传图片/文件。默认情况下,DRF不会解析多部分数据。

要使drf解析多部分数据,您必须告诉DRP视图使用MultiPartParser解析器。

from rest_framework.parsers import MultiPartParser
class ImageList(generics.ListCreateAPIView):
    ...
    ...     
    parser_classes = (MultiPartParser)
    ...

我建议在序列化程序中为图像字段添加imagefield,并在那里处理以上传到亚马逊并填充URLField

答案 1 :(得分:0)

好吧,我终于想出了如何做到这一点。我按照Saurabh Goyal的建议将image_path更改为ImageField。我用了这段代码:

class Image(models.Model):
    image_meta = models.ForeignKey('Image_Meta',on_delete=models.CASCADE,)
    image_path = models.ImageField(upload_to='images-data')
    order = models.IntegerField()
    version = models.CharField(max_length=10)

N提供了我的amazon s3存储桶详细信息,如 local_settings.py 文件中所示:

AWS_S3_ACCESS_KEY_ID = "Access_key_id"
AWS_S3_SECRET_ACCESS_KEY = "secret_access_key"
AWS_STORAGE_BUCKET_NAME = "bucket_name"

并将其添加到 settings.py

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

瞧!!有效。我希望这有助于有人遇到与我同样的问题。