2016-02-29 25 views
7

Tôi đang làm việc với một ứng dụng sử dụng Django Rest Framework.tải lên hình ảnh bằng cách sử dụng 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 

mẫu 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') 

Đây chỉ là một phần của toàn bộ hệ thống. Tôi muốn tải lên hình ảnh bằng cách sử dụng RESTAPI và sau đó tải nó lên amazon s3 và từ đó nhận được url và lưu trữ nó trong trường hình ảnh image_path của hình ảnh mô hình. Tôi đã thấy các giải pháp trước đây để tải lên các tệp bằng REST (like this) nhưng không có tác dụng gì đối với trường hợp của tôi. Ai đó có thể đề nghị làm thế nào tôi có thể làm điều đó?

+0

Bạn chỉ nên sử dụng 'ImageField'. Với điều này, hình ảnh thực tế sẽ chỉ được lưu trong S3 và trường trong DB sẽ có đường dẫn đến hình ảnh, trong mã, bạn có thể truy cập bằng cách sử dụng 'image.url'. –

+0

@SaurabhGoyal Vui lòng giải thích cách tôi có thể truy cập url hình ảnh? –

+0

Tôi đã nhận nó anyway :) –

Trả lời

0

Vâng, tôi cuối cùng đã tìm ra cách này có thể được thực hiện. Tôi đã thay đổi image_path thành ImageField theo gợi ý của Saurabh Goyal. Tôi đã sử dụng mã này:

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 cung cấp amazon s3 chi tiết xô tôi như trong local_settings.py tập tin như:

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

và bổ sung này để settings.py:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage' 

và thì đấy !! Nó đã làm việc. Tôi hy vọng điều này sẽ giúp ai đó bị mắc kẹt ở cùng một vấn đề với tôi.

0

Chúng tôi biết rằng hình ảnh/tệp được tải lên bằng cách sử dụng multipart/form-data. Theo mặc định, DRF không phân tích cú pháp dữ liệu nhiều phần.

Để tạo dữ liệu phân tích cú pháp phân tích cú pháp phân tích, bạn phải thông báo cho chế độ xem DRP để sử dụng trình phân tích cú pháp MultiPartParser.

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

tôi sẽ khuyên bạn nên có một imagefield trong serializer của bạn cho lĩnh vực hình ảnh, và xử lý nó ở đó để tải lên amazon và cư URLField

Các vấn đề liên quan