代码之家  ›  专栏  ›  技术社区  ›  kohl

Django Rest框架中的Post请求处理

  •  4
  • kohl  · 技术社区  · 7 年前

    我正在使用Django Rest框架,目前正在使用Get请求从后端提取一些数据,但由于URL限制越来越高,我们计划实现Post请求。为此,首先必须提供后端Django Rest API来服务post请求。

    我是Django新手,在代码中找不到post或get方法,我只能说我们使用的是视图集,我尝试过使用“@detail\u route(methods=['post')”),但这不起作用,我这里做错了什么?

    class XViewSet(viewsets.ViewSet):
        renderer_classes = ''
    
        def retrieve(self, request, pk=None):
            try:
                pk = int(pk)
            except ValueError:
                raise InvalidParameterError(parameter_name='id', invalid_value=pk)
    
            queryset = models.X.objects.all()
            x = get_object_or_404(queryset, pk=pk)
    
            pipelines = request.query_params.getlist('pipeline[]')
    
            callsets =
    
            callset_ids =
    
            serializer = serializers.XSerializer(x, context={'request': request})
    
            requested_samples = [z[1:] for z in request.query_params.getlist('s')]
    
            filtered_calls = []
            serialized_data = serializer.data
    
            unfiltered_calls = serialized_data.get('calls')
            if unfiltered_calls:
                for serialized_calls in unfiltered_calls:
                    if serialized_calls['callset'] in callset_ids:
                        unfiltered_calls = serialized_calls['data']
    
                        for call in unfiltered_calls:
                            if call['y'] in requested_y:
                                filtered_calls.append(call)
    
                        break
    
            serialized_data['calls'] = filtered_calls
    
            return Response(serialized_data, status=status.HTTP_200_OK)
    
        def list(self, request):
    
            qp = self.request.query_params
    
            validated_qp =
    
            # generate the query
            query_object =
            query =
    
            # execute the query
            cursor = connections['default'].cursor()
            cursor.execute(query)
    
            qs = utils.dictfetchall(cursor)
    
            # sanitize query results
            if 't' in validated_qp:
                return_data =
            else:
                for x in qs:
                    if 'calls' in x:
    
                        x['calls'] =
                    else:
                        x['calls'] = {}
    
                return_data =
    
            resp = Response(return_data, status=status.HTTP_200_OK)
    
            if validated_qp.get(''):
                resp['content-disposition'] =
    
            return resp
    
    1 回复  |  直到 7 年前
        1
  •  7
  •   JPG    7 年前

    您可以使用 class-based views 为了满足要求,

    from rest_framework.views import APIView
    
    
    class MyAPI(APIView):
        def get(selfself, request):
            # do stuff with get
            return Response(data="return msg or data")
    
        def post(self, request):
            post_data = request.data
            # do something with `post_data`
            return Response(data="return msg or data")
    



    更新:使用视图集
    ViewSet 类提供给我们 create() 方法创建新模型实例。所以我们可以覆盖它来处理到达视图的post数据。只需添加一个 创建() 在视图类下,如下所示

    class XViewSet(viewsets.ViewSet):
        renderer_classes = ''
    
        def create(self, request): # Here is the new update comes <<<<
            post_data = request.data
            # do something with post data
            return Response(data="return data")
    
        def retrieve(self, request, pk=None):
            # your code
    
            return Response(serialized_data, status=status.HTTP_200_OK)
    
        def list(self, request):
            # your code
            return resp