Django Rest 框架中的发布请求处理

Posted

技术标签:

【中文标题】Django Rest 框架中的发布请求处理【英文标题】:Post request handling in Django Rest framework 【发布时间】:2018-07-31 19:01:45 【问题描述】:

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

我是 Django 新手,我没有在代码中找到 post 或 get 方法,我只能说我们正在使用视图集,我尝试使用 "@detail_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】:

您可以使用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 ViewSet 类为我们提供create() 方法来创建新的模型实例。所以我们可以覆盖它来处理进入视图的发布数据。只需在您的视图类下添加create(),如下所示

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

【讨论】:

如前所述,如果我使用视图集而不是 APIViews,我该如何实现 post 方法。 另外,如果我在 post 请求的正文中发送参数,我如何在后端访问它们? request.data 是否提供此数据? 是的。 request.data 包含全部内容。只需使用print() 来验证 @Yougesh 我在回答中提到了response.data吗? @JerinPeterGeorge 对不起它的request.data,错字,但我已经解决了,这个问题是由于调试点而发生的,无论如何谢谢

以上是关于Django Rest 框架中的发布请求处理的主要内容,如果未能解决你的问题,请参考以下文章

django rest 框架 POST 请求因嵌套序列化而失败

如何在 Django Rest Framework 中处理并行请求?

如何在 django rest 框架中访问获取请求数据

Django rest 框架和跨源请求

从 Vuejs 到 Django REST 框架的 Axios POST 请求

Django REST框架-请求与响应