Создание простого API, который принимает файлы - PullRequest
0 голосов
/ 07 декабря 2018

Я создаю API, который принимает файл и проверяет его, отправляет ответ json (не хранит файл в БД, поэтому модель не нужна).Я создал представление на основе классов, в функции post, request.FILES или request.POST не содержит файл ... Если я создаю класс формы, он будет работать.Но я не хочу никакого пользовательского интерфейса, это должен быть простой 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 ]

0 голосов
/ 07 декабря 2018

Разобрался ... Проблема в том, что я не посылаю ключ file из postman.Это я понял, при использовании curl ... wowww, инструменты командной строки качается ...

также, мне нужно использовать request.FILES['file'] для доступа к файлу и делать свои вещи ...

0 голосов
/ 07 декабря 2018

вы можете создать сериализатор

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

Теперь отправьте запрос в форме данных

...