Obecnie pracuję nad projektem, który umożliwia użytkownikowi aplikacji mobilnej przesyłanie obrazów na serwer Django.
Oto mój widok, który obsługuje żądanie POST od użytkownika:
klasa 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")
Kod zawsze zwraca błąd HTTP 400, co oznacza, że serializator jest nieprawidłowy.
Oto rozwiązania, które próbowałem zastosować, ale nie działają w tym przypadku:
Zmień media_filename z
data1 = {"image": media_filename, "category": 1, "status": "Y", "user": user}
to img, ale wracaTypeError: <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=2976x3968 at 0x841D2F0> is not JSON serializable
błądZastąp media_filename na
media_url/img.jpg
, zwraca ten sam błąd.Zaktualizuj pole obrazu w serializatorze, dodając (patrz kod poniżej), ale w ogóle wprowadza jakiekolwiek ulepszenia:
class ImageDetailsSerializer(serializers.ModelSerializer): image = serializers.ImageField(use_url=True) class Meta: model = ImageDetails fields= ("image","status","category", "user")
Moje pytania to:
Co powinno być przechowywane w ImageField serializatora? obraz, adres URL obrazu lub katalog, w którym obraz jest przechowywany?
Czy to jest właściwy sposób / technika zapisywania danych od zdalnego użytkownika? Czy jest jakiś inny skuteczny sposób na wdrożenie tego?
Odpowiedzi:
0 dla odpowiedzi № 1- Jest to ścieżka względna do katalogu_główny_mediów
- Możesz się zmienić
data1
do kopiirequest.data
i połącz klucz „user” z nowym dyktando
0 dla odpowiedzi nr 2
Odpowiedzią na ten problem jest użycie wtyczki Django-extra-fields. :RE Czytać https://github.com/Hipo/drf-extra-fields po więcej szczegółów.