首页 > 解决方案 > 从 Django 从 rest_framework 检索图像

问题描述

模型.py:

from __future__ import unicode_literals
from django.db import models
class Photo(models.Model):
    title = models.CharField(max_length=255, blank=True)
    file = models.FileField()
    uploaded_at = models.DateTimeField(auto_now_add=True)

序列化程序.py:

from rest_framework import serializers
from . models import Photo

class imageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Photo
        fields='__all__'

视图.py:

from django.shortcuts import render,redirect
from django.http import JsonResponse
from django.views import View
import time
from rest_framework import generics
from .forms import PhotoForm
from .models import Photo
from django.http import HttpResponse
from rest_framework.response import Response
from django.shortcuts import get_object_or_404
from rest_framework.views import APIView
from rest_framework import status
from .serializers import imageSerializer 
import requests       


class DragAndDropUploadView(View):
    def get(self, request):
        photos_list = Photo.objects.all()
        return render(self.request, 'UploadMulti/drag_and_drop_upload/index.html', {'photos': photos_list})

    def post(self, request):
        form = PhotoForm(self.request.POST, self.request.FILES)
        if form.is_valid():
            photo = form.save()
            data = {'is_valid': True, 'name': photo.file.name, 'url': photo.file.url}
        else:
            data = {'is_valid': False}
        return JsonResponse(data)


def clear_database(request):
    for photo in Photo.objects.all():
        photo.file.delete()
        photo.delete()
    return redirect(request.POST.get('next'))



class ImagesList(APIView):
    def get(self,request):
        imagelist=Photo.objects.all()
        serializer = imageSerializer(imagelist,many=True)
        return Response(serializer.data) 
    def post(self):
        pass    

def backend(request):
    response = requests.get('http://localhost:8000/images/')
    api_values = response.json()
    for values in api_values:
        print(type(values['file']))
    return render(request,"home.html",{'data':api_values})

当我打印 values.file 的类型时,这是我得到的图像数据,因此当将其发送到前端时,图像不会显示

如何从rest api检索为图像文件?

HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

[
    {
        "id": 1,
        "title": "",
        "file": "think-twice-code-once.jpg",
        "uploaded_at": "2019-11-27T12:34:32.270786Z"
    }
]

是否有任何其他方法可以从其余框架获取图像以及图像是否存储为图像格式?

标签: pythondjangodjango-rest-framework

解决方案


问题是由于您FileField对此特定序列化程序的配置。你需要use_url是真实的。因此,您可以更改UPLOADED_FILES_USE_URL设置或设置如下所示use_url=TrueimageSerializer

class imageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Photo
        fields='__all__'
    file = serializers.FileField(use_url=True)

旁注,imageSerializer应该真正ImageSerializer遵循 python 类命名准则。


推荐阅读