簡體   English   中英

基於Content-Type標頭的Python / Django REST Framework POST

[英]Python/Django REST Framework POST based on Content-Type header

我有一個如下的APIView,需要基於內容類型標頭進行“發布”。

我們正在使用一個外部PUSH API,該API需要發布到單個端點,首先使用'application / json'發布JSON數據,然后使用'multipart / form-data'上傳一個文件。

下面的視圖可以發布一個或另一個(如果已刪除),即:僅上傳文件或僅發布JSON,但我似乎無法根據接收到的“內容類型”選擇上傳文件或發布JSON與職位。

如果request.data['file']沒有文件,我只想發布JSON數據,如果有文件,則只需上傳文件。 我可以發布以上傳文件,但是JSON發布序列化程序需要'file'並拋出KeyError。

我已經嘗試了此代碼的各種迭代,如何實現?

class ridesViewSet(APIView):
    permission_classes = (AllowAny, )
    queryset = rides.objects.all()
    serializer_class = ridesSerializer
    parser_classes = (JSONParser, MultiPartParser, )

    def post(self, request, format=None):

        up_file = None
        if request.content_type == 'multipart/form-data':
            up_file = request.data['file']

        if up_file == None:
            serializer = ridesSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        else:
            if socket.getfqdn() == 'STG' or socket.getfqdn() == 'PRD':
                destination = open(PRD_UPLOAD + up_file.name, 'wb+')
            else:
                destination = open('/Users/ncole/Documents/rides/ridesAPI/uploads/' + up_file.name, 'wb+')
            for chunk in up_file.chunks():
                destination.write(chunk)
                destination.close()
            return Response(up_file.name, status=status.HTTP_201_CREATED)

嘗試改變

up_file = request.data['file']

up_file = request.data.get('file') # use .get() to avoid keyerror

這樣可以避免KeyError問題。

使用if up_file is not None的以下解決方案解決:

謝謝@RahulGupta的協助!

# FULL WORKING POST FOR JSON & FILE
def post(self, request, format=None):
    up_file = request.data.get('file')
    serializer = ridesSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        if up_file is not None:
            if socket.getfqdn() == 'STG' or socket.getfqdn() == 'PRD':
                destination = open(PRD_UPLOAD + up_file.name, 'wb+')
            else:
                destination = open('/Users/ncole/Documents/rides/ridesAPI/uploads/' + up_file.name, 'wb+')
            for chunk in up_file.chunks():
                destination.write(chunk)
                destination.close()
            return Response(up_file.name, status=status.HTTP_201_CREATED)
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM