创建接受文件的普通API

时间:2018-12-07 03:43:17

标签: python django django-rest-framework django-views

我正在构建一个API,该API接受文件并对其进行验证,发送json响应(不将文件存储在db中,因此不需要模型)。我已经在发布函数中创建了一个基于类的视图,request.FILESrequest.POST不包含文件……如果我创建一个表单类,它将起作用。但是,我不需要任何UI,它应该是一个简单的API。有人知道怎么做吗?

class ValidateView(View):
    def get(self, request, *args, **kwargs):
        pass

    def post(self, request, *args, **kwargs):
        file = request.FILES
        if not file:
            return JsonResponse({"status_code": "400", "message": "a file is required", "status_response": "Bad Request"})
        return JsonResponse({"status_code": "200", "message": "data validated", "status_response": "Success"})

    @csrf_exempt
    def dispatch(self, request, *args, **kwargs):
        return super(ValidateView, self).dispatch(request, *args, **kwargs)

我使用了djangorestframework并提出了这个

class ValidateView(views.APIView):
    parser_classes = (FileUploadParser,)

    def post(self, request, filename, format=None):
        file_obj = request.data['file']
        if is_csv_valid(file_obj):
            return Response(status=200, data={"message": "valid file"})
        else:
            return Response(status=400, data={"message": "not valid"})

但是,这里的问题是我必须建立一个像这样的网址

re_path("validate/(?P<filename>[^/]+)$", ValidateView.as_view(), name="api-validate")

如果我在网址中排除filename,则会引发错误。另外,file_obj包含一些额外的行以及诸如此类的原始数据。

[b'----------------------------634867545113999762020341\r\n', b'Content-Disposition: form-data; name=""; filename="kafka_word_count_input.txt"\r\n', b'Content-Type: text/plain\r\n', 'original_data']

有人帮助!

2 个答案:

答案 0 :(得分:0)

您可以创建序列化器

class FileSerializer(serializer.Serializers):
    file = serializer.FileFiled()

    def validate_file(self, value):
        # write  logic to validate
       if not is_csv_valid(value):
          raise serializer.ValidationError("wrong file")
       else:
         return value

 class ValidateView(views.APIView):
    serializer_class = FileSerializer
    def post(self, request, filename, format=None):
       serializer = self.serializer_class(data=request.data)
       if serializer.is_valid(raise_exception=True):
          return Response(status=200, data={"message": "valid file"})

现在发送表单数据中的需求

答案 1 :(得分:0)

想通了...问题是我没有从file发送密钥postman。我发现了这一点,当使用curl ...哇,命令行工具摇摇欲坠...

另外,我需要使用request.FILES['file']来访问文件并执行我的工作...