代码之家  ›  专栏  ›  技术社区  ›  Lokesh Sanapalli

创建接受文件的普通api

  •  0
  • Lokesh Sanapalli  · 技术社区  · 7 年前

    我正在构建一个api,它接受并验证文件,发送json响应(不将文件存储在db中,因此不需要模型)。我在post函数中创建了一个基于类的视图, request.FILES request.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"})
    

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

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

    如果我排除 filename 在url中,它抛出一个错误。也, 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 回复  |  直到 7 年前
        1
  •  0
  •   aman kumar    7 年前

    您可以创建序列化程序

    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"})
    

    现在发送表单数据中的reuqest

        2
  •  0
  •   Lokesh Sanapalli    7 年前

    明白了…问题是我没有发送密钥 file postman . 当我使用 curl …wowww,命令行工具摇滚…

    还有,我需要用 request.FILES['file'] 访问文件和做我的事情…