【问题标题】:Combining request.data and request.query_params in Django REST Framework在 Django REST 框架中结合 request.data 和 request.query_params
【发布时间】:2016-04-14 07:35:13
【问题描述】:

我正在使用 DRF 构建一个 RPC 样式的 API,其中每个端点都可以使用 GET 或 POST 方法调用。到目前为止,我已经很好地结合了这些方法:

class UpdateUser(APIView):
    permission_classes = (permissions.IsAuthenticated,)

    def post(self, request, *args, **kwargs):
        return self.get(request, *args, **kwargs)

    def get(self, request, format=None):
        # Do stuff here with request.data

不幸的是,POST 在request.data 中提供数据,而在request.query_params 中提供 GET。有没有办法将它们组合成request.data 或像request.params 这样的自定义?解析器似乎不起作用,因为它们没有被 GET 请求调用。

【问题讨论】:

  • http://example.com/test/?param_name=1 可以使用request.GET.get('param_name')获取查询参数值,它会返回1
  • 当然可以在get 函数中同时使用request.datarequest.query_params,但考虑到添加的样板,我想避免这种情况。
  • 建议使用 request.query_params 而不是 request.GET 以使您的代码更具可读性 (source)。

标签: django django-rest-framework


【解决方案1】:

我同意@jorilallo' cmets 关于在get 函数中使用request.data 的观点。

或者,您可以做的是在视图中创建另一个函数,该函数可以有 request.datarequest.query_params 作为参数:

class UpdateUser(APIView):
    permission_classes = (permissions.IsAuthenticated,)

    def post(self, request, *args, **kwargs):
        # POST have request.data 
        return self.process_request(request, request.data)

    def get(self, request, format=None):
        # GET have request.query_params
        return self.process_request(request, request.query_params)

    def process_request(self, request, data):
        # Do stuff here with data
        # return a response

这里,process_request 函数从 postget 方法调用,相关的 data 作为参数传递。

【讨论】:

  • 我认为这在我的上下文中很有意义并且非常干净。谢谢,我会去的!
猜你喜欢
  • 1970-01-01
  • 2015-04-17
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
相关资源
最近更新 更多