2016-02-29 13 views
7

Pracuję z aplikacją przy użyciu Django Rest Framework.wysyłanie obrazów za pomocą RESTAPI

models.py

class Image(models.Model): 
    image_meta = models.ForeignKey('Image_Meta',on_delete=models.CASCADE,) 
    image_path = models.URLField(max_length=200) 
    order = models.IntegerField() 
    version = models.CharField(max_length=10) 

serializers.py

class ImageSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Image 
     field = ('id', 'image_path' , 'order' , 'version') 

views.py

class ImageList(generics.ListCreateAPIView): 
    queryset = Image.objects.all() 
    serializer_class = ImageSerializer 

class ImageDetail(generics.RetrieveUpdateDestroyAPIView): 
    queryset = Image.objects.all() 
    serializer_class = ImageSerializer 

wzorców URL

url(r'^image/$',views.ImageList.as_view(),name='image_list'), 
url(r'^image/(?P<pk>[0-9]+)/$',views.ImageDetail.as_view(),name='image_detail') 

To jest tylko częścią całego systemu. Chcę wgrać obrazy za pomocą RESTAPI, a następnie przesłać je do Amazona s3, a następnie pobrać adres URL i zapisać w polu image_path modelu Image. Widziałem wcześniejszych rozwiązań do przesyłania plików przy użyciu REST (like this), ale nic nie działało w moim przypadku. Czy ktoś może zasugerować, w jaki sposób mogę to zrobić?

+0

Powinieneś po prostu użyć 'ImageField'. Dzięki temu rzeczywisty obraz zostanie zapisany tylko w S3, a pole w DB będzie miało ścieżkę do obrazu, który w kodzie umożliwia dostęp za pomocą 'image.url'. –

+0

@SaurabhGoyal Proszę wyjaśnić, w jaki sposób mogę uzyskać dostęp do adresu URL obrazu? –

+0

Mam to i tak :) –

Odpowiedz

0

No ale w końcu zorientowali się, w jaki sposób można to zrobić. Zmieniłem ścieżkę image_path na ImageField zgodnie z sugestią Sauraba Goyala. Użyłem tego kodu:

class Image(models.Model): 
    image_meta = models.ForeignKey('Image_Meta',on_delete=models.CASCADE,) 
    image_path = models.ImageField(upload_to='images-data') 
    order = models.IntegerField() 
    version = models.CharField(max_length=10) 

N pod warunkiem moje dane Amazon S3 wiadra jak w local_settings.py pliku jako:

AWS_S3_ACCESS_KEY_ID = "Access_key_id" 
AWS_S3_SECRET_ACCESS_KEY = "secret_access_key" 
AWS_STORAGE_BUCKET_NAME = "bucket_name" 

i dodał to settings.py:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage' 

i voila !! Zadziałało. Mam nadzieję, że pomoże to komuś utknąć w tym samym problemie co ja.

0

Wiemy, że obrazy/pliki są przesyłane za pomocą multipart/form-data. Domyślnie DRF nie analizuje danych wieloczęściowych.

Aby dokonać analizy danych wieloczęściowych DRF, musisz powiedzieć widokowi DRP, aby używał parsera MultiPartParser.

from rest_framework.parsers import MultiPartParser 
class ImageList(generics.ListCreateAPIView): 
    ... 
    ...  
    parser_classes = (MultiPartParser) 
    ... 

Ja polecam mieć imagefield w swoim serializatora dla pola obrazu, i przetwarza je tam, aby przesłać do amazon i wypełnić URLField