【问题标题】:How to setup an API which allows uploading JSON data and an image?如何设置允许上传 JSON 数据和图像的 API?
【发布时间】:2015-06-20 09:04:36
【问题描述】:

我使用Django REST Framework 来构建 API。以下视图集为客户端传输的 JSON 对象创建数据库条目。

class ArticleViewSet(mixins.CreateModelMixin,
                    mixins.RetrieveModelMixin,
                    mixins.ListModelMixin,
                    viewsets.GenericViewSet):
    """
    API endpoint that allows articles to be created or viewed.
    """
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

现在,我想发送 图像和 JSON 数据。我猜客户端必须将其请求作为"multipart/form-data" mime 类型发送。如果这是错误的,请纠正我。
所以,我加了一个MultiPartParser

parser_classes = (MultiPartParser,)

为了在服务器端使用ipdb 调试请求,我添加了create 方法:

class ArticleViewSet(mixins.CreateModelMixin,
                    mixins.RetrieveModelMixin,
                    mixins.ListModelMixin,
                    viewsets.GenericViewSet):
    """
    API endpoint that allows articles to be created or viewed.
    """
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer
    parser_classes = (MultiPartParser,)

    def create(request, *args, **kwargs):
        ipdb.set_trace()
        return Response(request)

我怎样才能真正检查request是否收到数据?

经验教训

  1. 不需要配置MultiPartParser,因为它是loaded by default
  2. 我添加的create方法的签名是错误的。它必须是create(self, request, *args, **kwargs)。这样您就可以检查request 对象和request.data。感谢来自 IRC #restframeworkJockeTF !!
  3. 可以使用 cURL 从命令行发送测试请求,如下所示:

    $ curl -vX POST http://localhost:8000/articles/ \
    -H "Content-Type: multipart/form-data" \
    -H "Accept:application/json" \
    -F "title=Test" \
    -F "author_name=cURL" \
    -F "article_photo=@/home/user/Desktop/article-photo.png"
    

【问题讨论】:

  • 我对 Django REST 框架没有任何经验,但如果您使用 json,您可以对文件内容进行 base-64 编码,并将其作为 json 对象中的字段传递,而无需multipart/form-data.

标签: python django django-rest-framework image-uploading multipartform-data


【解决方案1】:

是的,您的客户应该这样做(js 示例)

var formdata = new FormData();
formdata.append("image", file);

在 Django 中,可以在 request.FILES['image'] 中访问上传的文件

查看 Django 文档以获取此 https://docs.djangoproject.com/en/1.7/topics/http/file-uploads/

【讨论】:

    【解决方案2】:

    这就是我所做的......

    1. 安装Pillow package进行图像处理
    2. 使用新属性扩展您的模型

      article_photo = models.ImageField(blank=True)
      
    3. settings.py中配置如下设置:

      • 对于开发环境:

        ENV_PATH = os.path.abspath(os.path.dirname(__file__))
        
        """
        Absolute filesystem path to the directory that 
        will hold user-uploaded files.
        """
        MEDIA_ROOT = os.path.join(ENV_PATH, 'media/')
        
        """
        Relative browser URL you should access your media files from
        """
        MEDIA_URL = '/media/'
        
      • 对于生产环境:

        """
        Absolute filesystem path to the directory that 
        will hold user-uploaded files.
        """
        MEDIA_ROOT = '/myapp/api/media'
        
        """
        Relative browser URL you should access your media files from
        Path must be served from webserver (Nginx, Apache, ..) configuration
        """
        MEDIA_URL = '/myapp/media/'
        
    4. 创建一个新的迁移并运行它。

      $ python manage.py makemigrations  
      $ python manage.py migrate
      
    5. 使用 cURL 从命令行发送测试请求,如下所示:

      $ curl -vX POST http://localhost:8000/articles/ \
      -H "Content-Type: multipart/form-data" \
      -H "Accept:application/json" \
      -F "title=Test" \
      -F "author_name=cURL" \
      -F "article_photo=@/home/user/Desktop/article-photo.png"
      

    【讨论】:

      猜你喜欢
      • 2010-11-14
      • 2023-03-12
      • 2021-09-17
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      • 2013-10-31
      • 2014-04-25
      • 2021-08-06
      相关资源
      最近更新 更多