Je travaille actuellement sur un projet qui permet à l'utilisateur d'une application mobile de télécharger des images sur un serveur Django.
Voici ma vue qui sert la demande POST de l'utilisateur:
classe ImageDetailsViewSet (APIView):
def post(self,request, *args, **kwargs):
try:
######### Accept string from the user
imgStr = request.data["image"]
media_filename = os.path.join(settings.MEDIA_ROOT, "img.jpg")
######## Create decoded string to a JPEG file and save it to media_root
img = Image.open(StringIO(imgStr.decode("base64")))
img.save(media_filename, "JPEG")
###### Update request data to include the newly created image to the request
user = request.user.get_username()
data1 = {"image": media_filename, "category": 1, "status": "Y", "user": user}
serializer = ImageDetailsSerializer(data=data1)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)
except:
raise
return Response(serializer.errors, status=status.HTTP_415_BAD_REQUEST)
My ImageDetailsSerializer:
class ImageDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = ImageDetails
fields= ("image","status","category", "user")
Le code renvoie toujours une erreur HTTP 400, ce qui signifie que le sérialiseur n'est pas valide.
Voici les solutions que j'ai essayé d'appliquer mais qui ne fonctionnent pas dans ce cas:
Modifiez le nom du fichier média
data1 = {"image": media_filename, "category": 1, "status": "Y", "user": user}
img mais il revientTypeError: <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=2976x3968 at 0x841D2F0> is not JSON serializable
ErreurRemplacez nom_fichier_média par
media_url/img.jpg
, il renvoie la même erreur.Mettez à jour le champ d'image dans le sérialiseur en l'ajoutant (voir le code ci-dessous) mais cela apporte des améliorations:
class ImageDetailsSerializer(serializers.ModelSerializer): image = serializers.ImageField(use_url=True) class Meta: model = ImageDetails fields= ("image","status","category", "user")
Mes questions sont:
Que doit-on stocker dans un ImageField d'un sérialiseur? une image, une URL d'image ou le répertoire dans lequel l'image est stockée?
Est-ce la bonne manière / technique pour enregistrer les données d'un utilisateur distant? Ou existe-t-il un autre moyen efficace de mettre en œuvre cela?
Réponses:
0 pour la réponse № 1- C’est le chemin par rapport à media_root
- Vous pouvez changer
data1
à une copie derequest.data
et fusionner "l'utilisateur" clé dans le nouveau dict
0 pour la réponse № 2
La réponse à ce problème est d'utiliser le plugin Django-extra-fields. :RÉ Lis https://github.com/Hipo/drf-extra-fields pour plus de détails.