GET Body 未与 APIClient Django DRF 一起发送

kar*_*aka 3 django get http python-3.x django-rest-framework

我想在 django drf 测试用例中使用 get 请求发送正文数据 APITestCase

例如

data ={'hi':'bye'}
self.client.get('media_list/', {'body': data})
Run Code Online (Sandbox Code Playgroud)

在视图中,我可以使用以下代码获取主体

request.data.get('hi', None)
Run Code Online (Sandbox Code Playgroud)

但它不能使用{'body': data}我的测试方法工作,但它在postman原始类型中工作正常。

尝试的是(不工作)

self.client.get('media_list/', data=data)
Run Code Online (Sandbox Code Playgroud)

小智 7

我在编写单元测试时遇到了这个问题。您可以使用此解决方法解决它。

问题:当您使用 client.get 方法请求时,该方法会将您的数据放入 url。你可以在下面看到链接。
https://github.com/encode/django-rest-framework/blob/master/rest_framework/test.py#L194

解决方法:你应该client.generic()直接使用。不要使用client.get() https://github.com/encode/django-rest-framework/blob/master/rest_framework/test.py#L203

例子

import json
from rest_framework.test import APIClient
from rest_framework.test import APITestCase


class TestClass(APITestCase):
    def setUp(self):
        # Setup run before every test method.
        pass

    def test_send_json_in_body(self):
        data ={'hi' : 'bye'}
        resp = self.client.generic(method="GET", path="/return/data/", data=json.dumps(data), content_type='application/json')

Run Code Online (Sandbox Code Playgroud)
request._request
<WSGIRequest: GET '/return/data/'>
request.data
{'hi': 'bye'}
Run Code Online (Sandbox Code Playgroud)

有用 :)

  • 这应该是公认的答案。谢谢你! (2认同)

ham*_*atf 0

data` 返回请求正文,对于 get api,您需要获取查询参数尝试以下代码:


data = {'hi':'bye'}
self.client.get('media_list/', data)


request.query_params.get('hi', None)
Run Code Online (Sandbox Code Playgroud)