django 테스트클라이언트를 사용한JSON 전송
웹 훅의 엔드포인트 역할을 하는 django 프로젝트를 진행하고 있습니다.웹 훅은 일부 JSON 데이터를 내 엔드포인트에 POST합니다.이 데이터는 그 후 해석됩니다.유닛 테스트를 작성하려고 하는데 제대로 JSON을 보내고 있는지 모르겠습니다.
pipeline_endpoint에 "TypeError: 문자열 인덱스는 정수여야 합니다"가 계속 표시됩니다.
코드는 다음과 같습니다.
# tests.py
from django.test import TestCase
from django.test.client import Client
import simplejson
class TestPipeline(TestCase):
def setUp(self):
"""initialize the Django test client"""
self.c = Client()
def test_200(self):
json_string = u'{"1": {"guid": "8a40135230f21bdb0130f21c255c0007", "portalId": 999, "email": "fake@email"}}'
json_data = simplejson.loads(json_string)
self.response = self.c.post('/pipeline-endpoint', json_data, content_type="application/json")
self.assertEqual(self.response.status_code, "200")
그리고.
# views.py
from pipeline.prospect import Prospect
import simplejson
def pipeline_endpoint(request):
#get the data from the json object that came in
prospects_json = simplejson.loads(request.raw_post_data)
for p in prospects_json:
prospect = {
'email' : p['email'],
'hs_id' : p['guid'],
'portal' : p['portalId'],
}
편집: 전체 트레이스백.
======================================================================
ERROR: test_200 (pipeline.tests.TestPipeline)
----------------------------------------------------------------------
Traceback (most recent call last):
File "F:\......\pipeline\tests.py", line 31, in test_200
self.response = self.c.post('/pipeline-endpoint', json_string, content_type="application/json")
File "C:\Python27\lib\site-packages\django\test\client.py", line 455, in post
response = super(Client, self).post(path, data=data, content_type=content_type, **extra)
File "C:\Python27\lib\site-packages\django\test\client.py", line 256, in post
return self.request(**r)
File "C:\Python27\lib\site-packages\django\core\handlers\base.py", line 111, in get_response
response = callback(request, *callback_args, **callback_kwargs)
File "F:\......\pipeline\views.py", line 18, in pipeline_endpoint
'email' : p['email'],
TypeError: string indices must be integers
----------------------------------------------------------------------
Ran 1 test in 0.095s
FAILED (errors=1)
Destroying test database for alias 'default'...
@mrmagooey가 맞다
def test_your_test(self):
python_dict = {
"1": {
"guid": "8a40135230f21bdb0130f21c255c0007",
"portalId": 999,
"email": "fake@email"
}
}
response = self.client.post('/pipeline-endpoint/',
json.dumps(python_dict),
content_type="application/json")
사용하다json.dumps
대신json.loads
시험:
self.client.generic('POST', '/url', json.dumps({'json': 'object'})
rest_framework
s(기본값)client_class
덤프 처리를 합니다.dict
로.JSON
전달함으로써 적절한 콘텐츠 유형을 설정합니다.format='json'
.
from rest_framework import status
from rest_framework.test import APIClient, APITestCase
class MyTestCase(APITestCase):
url = '/url'
def post(self, payload, url=None):
"""
Helper to send an HTTP post.
@param (dict) payload: request body
@returns: response
"""
if url is None:
url = self.url
return self.client.post(url, payload, format='json')
def test_my_function(self):
payload = {
'key': 'value'
}
response = self.post(payload)
self.assertEqual(response.status_code, status.HTTP_200_OK)
언제든지 HttpRequest를 사용할 수 있습니다.Raw Request 데이터를 로드하는 본문.이렇게 하면 자신의 데이터 처리를 처리할 수 있습니다.
c = Client()
json_str= json.dumps({"data": {"id": 1}})
c.post('/ajax/handler/', data= json_str, content_type='application/json',
HTTP_X_REQUESTED_WITH='XMLHttpRequest')
def index(request):
....
print json.loads(request.body)
Django 3.0 이후:
content_type을 application/json으로 지정하면 데이터는 dict, list 또는 tuple인 경우 json.dumps()를 사용하여 시리얼화됩니다.시리얼화는 DjangoJ를 사용하여 수행됩니다.기본적으로는 SONEncoder이며 클라이언트에 json_encoder 인수를 제공하여 덮어쓸 수 있습니다.이 시리얼화는 put(), patch() 및 delete() 요구에도 발생합니다.
response = client.post(
f'/customer/{customer.id}/edit',
{'email': new_email},
content_type='application/json'
)
사용자 지정 가능iteritems
사전에 수록되어 있다
for index, p in prospects_json.iteritems():
prospect={
'email': p['email'],
}
또는 다른 방법으로
for index in prospect_json:
prospect={
'email': prospect_json[ index ]['email']
}
Guillaume Vincent의 답변에 덧붙여, Django 2.1부터는 데이터 전달에 json.dumps를 사용할 필요가 없어졌습니다.
Django 2.1에서 변경: 위에서 설명한 JSON 시리얼화가 추가되었습니다.이전 버전에서는 post()에 전달하기 전에 데이터 상에서 json.dumps()를 호출하여 동일한 작업을 수행할 수 있습니다.
언급URL : https://stackoverflow.com/questions/8583290/sending-json-using-the-django-test-client
'source' 카테고리의 다른 글
요소 외부를 클릭할 때 이벤트를 발생시키는 지시어 (0) | 2023.03.26 |
---|---|
폼 7과 커스텀 투고 타입에 문의합니다. (0) | 2023.03.26 |
커스텀 투고 타입의 연간/월간 아카이브 (0) | 2023.03.26 |
Node.js 및 MongoDB를 사용한 비밀번호 저장 (0) | 2023.03.26 |
jQuery get JSON 결과를 변수에 저장 (0) | 2023.03.26 |