【发布时间】: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是否收到数据?
经验教训
- 不需要配置
MultiPartParser,因为它是loaded by default。 - 我添加的
create方法的签名是错误的。它必须是create(self, request, *args, **kwargs)。这样您就可以检查request对象和request.data。感谢来自 IRC #restframework 的 JockeTF !! -
可以使用 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