我正在构建一个API,该API接受文件并对其进行验证,发送json响应(不将文件存储在db中,因此不需要模型)。我已经在发布函数中创建了一个基于类的视图,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"})
但是,这里的问题是我必须建立一个像这样的网址
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']
有人帮助!
答案 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']
来访问文件并执行我的工作...