Django Rest Framework:上传Image API

时间:2017-08-08 04:46:59

标签: python django django-rest-framework

我正在尝试通过django rest framework api将图像上传到我的django网站。 但是我收到了这个错误

  

{       " detail":"多部分表单解析错误 - 多部分中的无效边界:无" }

views.py

class UploadPhotoViewSet(APIView):
    parser_classes = (parsers.MultiPartParser, parsers.FormParser)

    def get(self, request,  format=None):
        model_object = Photo.objects.all()
        serializer = PhotoSerializer(model_object, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = PhotoSerializer(data=request.data)

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

serializers.py

class PhotoSerializer(serializers.ModelSerializer):
    thumbnail = serializers.ImageField(use_url=True)
    source = serializers.ImageField(use_url=True)
    class Meta:
        model = Photo
        fields = '__all__'

model.py

class Photo(models.Model):
    type = models.CharField(max_length=100, default='photo', editable=False)
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    description = models.TextField()
    category = models.CharField(max_length=255)

    def upload_thumb_dir(self, filename):
        path = '/media/{}/photos/thumbs/{}'.format(self.project.id, filename)
        return path
    thumbnail = models.ImageField(upload_to=upload_thumb_dir, default='/default/photo.png', blank=True)

    def upload_photo_dir(self, filename):
        path = '/media/{}/photos/{}'.format(self.project.id, filename)
        return path
    source = models.ImageField(upload_to=upload_photo_dir)

    def __str__(self):
        return self.title

enter image description here

1 个答案:

答案 0 :(得分:1)

我浪费了很多时间使用curl和httpie。 最好和最简单的方法是使用python requests

我使用Django Rest Framework找到了命令行上传图像的方法。

import requests
files = {'thumb': open('D:/thumb.jpg', 'rb'), 'preview': open('D:/preview.jpg', 'rb')}
r = requests.put('/path/to/your/django/rest/api', data={'key': value, 'key2': 'value2'}, files=files)
print r.status_code

如果你得到201,就意味着你已经完成了。