POST正文未与APIClient DRF发送

时间:2019-03-21 15:12:26

标签: django django-rest-framework

我是Django的新手,并且在Laravel中拥有扎实的背景(如果您碰巧做出一个很棒的比喻)

我正在尝试将身体传递到终点,但我做不到。

我尝试过:

fake = Faker('pt_PT')
fake.add_provider(company)
client = APIClient()


class CompanyPostTestCase(APITestCase):
    def setUp(self):
        self.email = fake.email()
        self.username = str(fake.company()).split()[0]
        self.valid_payload = {
            'email': self.email,
            'password': '123',
            'username': self.username
        }

    def test_company_was_created(self):
        response = self.client.post('/v1/company/',
                                    self.valid_payload,
                                    # Also tried with content_type='application/json'
                                    format='json')
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

但是在调试模式下执行时,response对象在POST内的_closable_objects中有QueryDict: {},我假设未指定body。错误消息还显示b'{"message":"You must provide a password"}',该错误消息清楚地表明未通过正文。

通过邮递员,我可以发出相同的请求并创建一个Company,而没有任何问题。

解决这个问题的任何想法都很棒。

编辑 我也尝试过将valid_payload直接传递给client.post(),就像这样:

response = client.post('/v1/company/', data={
                                   'email': self.email,
                                   'password': '123',
                                   'username': self.username
                               },
                               format='json')

此后仍然无法正常工作

2 个答案:

答案 0 :(得分:0)

客户端不是CompanyPostTestCase的一部分,可能会导致问题。初始化内部函数应该可以解决问题。

class CompanyPostTestCase(APITestCase):
    def setUp(self):
        self.email = fake.email()
        self.username = str(fake.company()).split()[0]
        self.valid_payload = {
            'email': self.email,
            'password': '123',
            'username': self.username
        }



    def test_company_was_created(self):
        client = APIClient()
        response = client.post('/v1/company/',
                                    self.valid_payload,
                                    format='json')
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

答案 1 :(得分:0)

我最近也遇到了类似的问题,以防万一它可以帮助处于相同位置的任何人,因为调试起来很痛苦。

在我的情况下,它最终是由于在Django设置文件的DRF的DEFAULT_PARSER_CLASSES中指定了错误的JSON解析器类所致。解决方案只是将其替换为默认的DRF JSON解析器(rest_framework.parsers.JSONParser)。

相关问题