将图像作为原始数据上传到django休息框架 [英] upload images as raw data in django rest framework
问题描述
我正在使用Django-rest框架,将我从本地系统上传到亚马逊s3的项目中。这是我正在使用的Html表单,工作正常。
这是模特图像。
models.py
class Image(models.Model):
image_meta = models.ForeignKey 'Image_Meta',on_delete = models.CASCADE,)
image = models.ImageField(upload_to ='images-data')
order = models.IntegerField()
version = models.CharField max_length = 10)
但是当我尝试以原始数据我收到一个错误。
我想知道如何做到这一点。我试图在本地系统中输入文件的位置,没有任何成功。
我在这里做错了什么,或者我在这里遗漏了什么? p>
views.py文件如下:
class ImageList(APIView) :
parser_classes =(JSONParser,)
def get(self,request,format = None):
images = Image.objects.all()
serializer = ImageSerializer(images,many = True)
return响应(serializer.data)
def post(self,request,format = None):
serializer = ImageSerializer .data,files = request.FILES)
print serializer
如果serializer.is_valid():
serializer.save()
返回响应({'received data':request。 data})
return响应(serializer.errors,status = status.HTTP_400_BAD_REQUEST)
serializer.py
class ImageSerializer(serializers.ModelSerializer):
class Meta:
model = Image
field =('id','image_path','order'版本')
在您的api视图类中使用
parser_classes =(FileUploadParser,MultiPartParser)
您的上传文件可作为request.data字典中的文件对象以file的形式提供。
您的前端客户端将文件数据发送到密钥file中。
在这里阅读更多关于FileUploadParser的信息: http://www.django-rest-framework.org/api-guide/parsers/#fileuploadparser
代码示例:
class FileUploadApiView(views.APIView):
def post(self,request,* args,** kwargs):
form = ImageForm(request.data)
如果form.is_valid():
image = form.save(commit = False)
else:
return响应(form.errors, status_code = status.HTTP_400_BAD_REQUEST)
如果request.data.get('file'):
image_file_obj = request.data.get('file')
#执行文件
image_path = save_on_s3(image)
image.image = image_path
image.save()
serializer = ImageSerializer(image)
return响应(serializer.data,status = status。 HTTP_200_OK)
else:
return响应(dict(error =no image uploaded),status_code = status.HTTP_400_BAD_REQUEST)
在模型中,我将字段图像作为路径字段,而不是ImageField。
I am using Django-rest Framework for a project in which I am uploading the images to amazon s3 from my local system. This I am doing using the Html form which works fine.
This is the model image.
models.py
class Image(models.Model):
image_meta = models.ForeignKey('Image_Meta',on_delete=models.CASCADE,)
image = models.ImageField(upload_to='images-data')
order = models.IntegerField()
version = models.CharField(max_length=10)
But when I try to upload the image as raw data I get an error.
I want to know how can I do that. I tried to enter the location of the file in the local system for image field without any success.
What am I doing wrong here or am I missing something here?
The views.py file is below:
class ImageList(APIView):
parser_classes = (JSONParser, )
def get(self, request, format=None):
images = Image.objects.all()
serializer = ImageSerializer(images, many=True)
return Response(serializer.data)
def post(self, request, format=None):
serializer = ImageSerializer(data=request.data , files=request.FILES)
print serializer
if serializer.is_valid():
serializer.save()
return Response({'received data': request.data})
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
serializer.py
class ImageSerializer(serializers.ModelSerializer):
class Meta:
model = Image
field = ('id', 'image_path' , 'order' , 'version')
In your api view class use
parser_classes = (FileUploadParser, MultiPartParser)
Your uploaded file be available as a file object in the request.data dictionary with the key as 'file'.
Your front end client will send the file data in the key "file".
Read more about the FileUploadParser here: http://www.django-rest-framework.org/api-guide/parsers/#fileuploadparser
code example:
class FileUploadApiView(views.APIView):
def post(self, request, *args, **kwargs):
form = ImageForm(request.data)
if form.is_valid():
image = form.save(commit=False)
else:
return Response(form.errors, status_code=status.HTTP_400_BAD_REQUEST)
if request.data.get('file'):
image_file_obj = request.data.get('file')
# do something with file
image_path = save_on_s3(image)
image.image = image_path
image.save()
serializer = ImageSerializer(image)
return Response(serializer.data, status=status.HTTP_200_OK)
else:
return Response(dict(error="no image uploaded"), status_code=status.HTTP_400_BAD_REQUEST)
Here in the model I have taken the field image as a path field and not as a ImageField.
这篇关于将图像作为原始数据上传到django休息框架的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!