【问题标题】:Move POST parameters to query parameters before processing request在处理请求之前将 POST 参数移动到查询参数
【发布时间】:2018-10-11 09:34:41
【问题描述】:

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

有公认的方法吗?

背景

我正在使用带有 DRF 后端的数据表,它工作正常。我正在将应用程序移至集成,然后......它停止工作。为什么?请求 URL 太大(在 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)

【问题讨论】:

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


    【解决方案1】:

    我不知道有任何接受的方式来做到这一点。但是让我给你一个想法。它可能与 accepted 的含义相反。

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

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

    我正在考虑用self._request.POST 替换self._request.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
            request._request.GET = request._request.POST
            return self.list(request, *args, **kwargs)
    

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

    注意:这很可疑,将来可能会引入错误。如果不查看您的代码,我无法预测副作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-08
      • 2023-01-18
      • 2019-11-29
      • 2017-08-23
      • 1970-01-01
      • 2019-09-12
      • 2012-04-12
      • 1970-01-01
      相关资源
      最近更新 更多