libros - python web pdf
Django Rest Framework ImageField (4)
Carga de archivos de imagen con Django Rest Framework:
models.py:
class MyPhoto(models.Model):
name = models.CharField(max_length=255)
image = models.ImageField(upload_to=''myphoto/%Y/%m/%d/'', null=True, max_length=255)
serializers.py:
class MyPhotoSerializer(serializers.ModelSerializer):
class Meta:
model = MyPhoto
fields = (''id'', ''name'', ''image'')
views.py:
class PhotoList(APIView):
def post(self, request, format=None):
serializer = MyPhotoSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Espero que ayude a alguien.
No puedo guardar la imagen en este ImageField.
al enviar datos de vuelta:
{
"image": ["No file was submitted. Check the encoding type on the form."]
}
model.py
class MyPhoto(models.Model):
owner = models.ForeignKey(''auth.User'', related_name=''image'')
image = models.ImageField(upload_to=''photos'', max_length=254)
serializers.py
class PhotoSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = MyPhoto
fields = (''url'', ''id'', ''image'', ''owner'')
owner = serializers.Field(source=''owner.username'')
view.py
class PhotoList(APIView):
permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly)
def get(self, request, format=None):
photo = MyPhoto.objects.all()
serializer = PhotoSerializer(photo, many=True)
return Response(data=serializer.data, status=status.HTTP_200_OK)
def post(self, request, format=None):
serializer = PhotoSerializer(data=request.DATA)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def pre_save(self, obj):
obj.owner = self.request.user
class PhotoDetail(APIView):
permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly)
def get_object(self, pk):
try:
return MyPhoto.objects.get(pk=pk)
except MyPhoto.DoesNotExist:
raise Http404
def get(self, request, pk, format=None):
photo = self.get_object(pk)
serializer = PhotoSerializer(photo)
return Response(serializer.data)
def put(self, request, pk, format=None):
photo = self.get_object(pk)
serializer = PhotoSerializer(photo, data=request.DATA)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk, format=None):
photo = self.get_object(pk)
photo.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
def pre_save(self, obj):
obj.owner = self.request.user
url.py
urlpatterns = patterns('''',
url(r''^$'', ''main.views.main_page''),
url(r''^api/photo/$'', views.PhotoList.as_view(), name=''myphoto-list''),
url(r''^api/photo/(?P<pk>[0-9]+)/$'', views.PhotoDetail.as_view(), name=''myphoto-detail''),)
rizo
curl -X POST -S /
-H ''Content-Type: application/json'' /
-u "michael:bush_pass" /
--data-binary ''{"owner":"/users/1/", /
"image":"/Users/test/Downloads/1383310998_05.jpg"}'' /
127.0.0.1:8000/api/photo/
Creo que puedes usar request.data
en su lugar después de django rest framework 3.0
. El uso de request.DATA
y request.FILES
ahora está pendiente de desaprobación a favor de un único atributo request.data
que contiene todos los datos analizados.
Puedes consultarlo desde here
Lo siguiente debería funcionar si está publicando la imagen como cadena base64 y su serializador se establece en consecuencia y hereda el serializador.Serializador
# views.py
import base64
import os
from django.core.files import File
class PhotoList(APIView):
def post(self,request,format=None):
serializer = PhotoSerializer(data=request.data)
if serializer.is_valid():
# access the data as serializer.validated_data[''keys'']
# save the MyPhoto obj lets call it myphoto
# get the base64 string
imgstr64 = serializer.validated_data[''corresponding filed in the serializer'']
imgdata = base64.b64decode(imgstr64)
fname = ''/tmp/%s.jpg''%(str(myphoto.id))
with open(fname,''wb'') as f:
f.write(imgdata)
imgname = ''%s.jpg''%(str(myphoto.id))
myphoto.image.save(imgname,File(open(fname,''r'')))
os.remove(fname)
Parece que le falta la request.FILES
Argumento de request.FILES
al constructor del serializador en la post
y los controladores de put
.
serializer = PhotoSerializer(data=request.DATA, files=request.FILES)