Django REST框架+ Django REST Swagger + ImageField [英] Django REST Framework + Django REST Swagger + ImageField

查看:52
本文介绍了Django REST框架+ Django REST Swagger + ImageField的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用ImageField创建了一个简单的模型,我想用django-rest-framework + django-rest-swagger制作一个api视图,该文档已被记录并能够上传文件.

I created a simple Model with an ImageField and I wanna make an api view with django-rest-framework + django-rest-swagger, that is documented and is able to upload the file.

这就是我得到的:

models.py

models.py

from django.utils import timezone
from django.db import models

class MyModel(models.Model):

    source = models.ImageField(upload_to=u'/photos')
    is_active = models.BooleanField(default=False)
    created_at = models.DateTimeField(default=timezone.now)

    def __unicode__(self):
        return u"photo {0}".format(self.source.url)

serializer.py

serializer.py

from .models import MyModel

class MyModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = MyModel
        fields = [
            'id',
            'source',
            'created_at',
        ]

views.py

views.py

from rest_framework import generics
from .serializer import MyModelSerializer

class MyModelView(generics.CreateAPIView):
    serializer_class = MyModelSerializer
    parser_classes = (FileUploadParser, )

    def post(self, *args, **kwargs):
        """
            Create a MyModel
            ---
            parameters:
                - name: source
                  description: file
                  required: True
                  type: file
            responseMessages:
                - code: 201
                  message: Created
        """
        return super(MyModelView, self).post(self, *args, **kwargs)

urls.py

urls.py

from weddings.api.views import MyModelView

urlpatterns = patterns(
    '',
    url(r'^/api/mymodel/$', MyModelView.as_view()),
)

对我来说,这应该很简单.但是,我无法进行上传.我总是收到以下错误响应:

For me this should be pretty simple. However, I can't make the upload work. I always get this error response:

我已经从 django-rest阅读了文档的这一部分-框架:

如果使用文件名URL关键字参数调用与FileUploadParser一起使用的视图,则该参数将用作文件名.如果在没有文件名URL关键字参数的情况下调用该文件,则客户端必须在Content-Disposition HTTP标头中设置文件名.例如Content-Disposition:附件;filename = upload.jpg.

但是django-rest-swagger在Request Payload属性(从chrome控制台)中传递了Header.

However the Header is being passed by django-rest-swagger in the Request Payload property (from chrome console).

如果需要更多信息,请告诉我.

If any more info is necessary, please let me know.

我正在使用 Django == 1.8.8 djangorestframework == 3.3.2 django-rest-swagger == 0.3.4 .

推荐答案

这是我想出的最终解决方案:

This is the final solution I came up with:

from rest_framework import generics
from rest_framework.parsers import FormParser, MultiPartParser
from .serializer import MyModelSerializer

class MyModelView(generics.CreateAPIView):
    serializer_class = MyModelSerializer
    parser_classes = (FormParser, MultiPartParser)

    def post(self, *args, **kwargs):
        """
            Create a MyModel
            ---
            parameters:
                - name: source
                  description: file
                  required: True
                  type: file
            responseMessages:
                - code: 201
                  message: Created
        """
        return super(MyModelView, self).post(self, *args, **kwargs)

我要做的就是将解析器从 FileUploadParser 更改为(FormParser,MultiPartParser)

All I had to do was change the parsers from FileUploadParser to (FormParser, MultiPartParser)

这篇关于Django REST框架+ Django REST Swagger + ImageField的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆