在处理请求之前将POST参数移动到查询参数

时间:2018-10-11 09:34:41

标签: django datatables django-rest-framework query-parameters post-parameter

我需要将request.POST参数移至request.query_params QueryDict

是否有接受的方法?

背景

我正在使用带有DRF后端的数据表,它工作正常。我正在将应用程序移至集成,并且...停止工作。为什么?请求网址太大(在7000个字符范围内)-在我的开发主机中这不是问题...

因此,我正在寻找解决该问题的方法。第一种解决方案是使用POST而不是GET。可以,但是将DRF与数据表集成在一起的库无法处理POST请求的表单参数。因此,过滤,分页等已停止工作。

解决此问题最简单的方法是将表单参数放入查询参数中,并让后端像正常的GET请求一样处理请求。

这是我目前正在做的事情:

class DataViewSet(viewsets.ModelViewSet):

    queryset = Data.objects.all()
    serializer_class = DataSerializer

    def create(self, request, *args, **kwargs):
        # DataTable uses a lot of parameters which do not fit into a normal URL. To get the data we need to do POST,
        #   so that the parameters are sent in the body
        # We hijack the create method to list the data
        return self.list(request, *args, **kwargs)

1 个答案:

答案 0 :(得分:0)

我不知道任何可接受的方法。但是,让我为您提供一个想法。可能与接受的含义相反。

rest_framework.request.Request.query_params看起来像这样:

@property
def query_params(self):
    return self._request.GET

我正在考虑将self._request.GET替换为self._request.POST

class DataViewSet(viewsets.ModelViewSet):

    queryset = Data.objects.all()
    serializer_class = DataSerializer

    def create(self, request, *args, **kwargs):
        # DataTable uses a lot of parameters which do not fit into a normal URL. To get the data we need to do POST,
        #   so that the parameters are sent in the body
        # We hijack the create method to list the data
        request._request.GET = request._request.POST
        return self.list(request, *args, **kwargs)

应该适用于POST数据。将文件发送到此端点可能不是一个好主意。

注意::此操作非常棘手,将来可能会引入错误。如果不查看您的代码,我将无法预测副作用。