8

DjangoのQuerydictの奇妙な動作と非常によく似た問題が発生しています。POSTディクショナリを単一のキーにまとめ、ユニットテストでDjangoJSONViewを実行します。ただし、これらのスレッドの質問/回答のいずれも、私が抱えている特定の問題を実際に示しているわけではありません。Djangoのテストクライアントを使用して、ネストされたJSONオブジェクトを使用してリクエストを送信しようとしています(JSON以外の値を持つJSONオブジェクトでうまく機能します)。

試み#1:これが私の最初のコードです:

    response = c.post('/verifyNewMobileUser/', 
        {'phoneNumber': user.get_profile().phone_number,
         'pinNumber': user.get_profile().pin,
         'deviceInfo': {'deviceID': '68753A44-4D6F-1226-9C60-0050E4C00067', 'deviceType': 'I'}})

ご覧のとおり、リクエストデータ内にネストされたJSONオブジェクトがあります。ただし、これはrequest.POSTのようになります。

<QueryDict: {u'phoneNumber': [u'+15551234567'], u'pinNumber': [u'4171'], u'deviceInfo': [u'deviceType', u'deviceID']}>

試行#2:次に、次のようにcontent-typeパラメーターを追加して試行しました。

response = c.post('/verifyNewMobileUser/', 
    {'phoneNumber': user.get_profile().phone_number,
     'pinNumber': user.get_profile().pin,
     'deviceInfo': {'deviceID': '68753A44-4D6F-1226-9C60-0050E4C00067', 'deviceType': 'I'}},
    'application/json')

そして私が今request.POSTのために得るものは

<QueryDict: {u"{'deviceInfo': {'deviceType': 'I', 'deviceID': '68753A44-4D6F-1226-9C60-0050E4C00067'}, 'pinNumber': 5541, 'phoneNumber': u' 15551234567'}": [u'']}>

私がやりたいのは、リクエストデータにネストされたdictを指定できるようにすることだけです。これを行う簡単な方法はありますか?

4

3 に答える 3

22

以下は私のために働きます(名前付き引数を使用):

geojson = {
        "type": "Point",
        "coordinates": [1, 2]
    }

    response = self.client.post('/validate', data=json.dumps(geojson),
                                content_type='application/json')
于 2013-02-03T04:39:19.383 に答える
6

あなたの問題は、Djangoがあなたのリクエストをmultipart/form-dataではなくとして解釈していることを示していますapplication/json。試す

c.post("URL", "{JSON_CONTENT}", content_type="application/json")

もう1つの注意点は、Pythonが文字列としてレンダリングされるときに一重引用符を使用して辞書のキー/値を表すことです。これは、simplejsonパーサーが好まないことです。ハードコードされたJSONオブジェクトを一重引用符で囲んだ文字列として保持し、内部で二重引用符を使用してこれを回避します...

于 2013-01-08T14:27:51.133 に答える
0

私の解決策は次のとおりです。

試験方法:

data_dict = {'phoneNumber': user.get_profile().phone_number,
             'pinNumber': user.get_profile().pin,
             'deviceInfo':
                 {'deviceID': '68753A44-4D6F-1226-9C60-0050E4C00067',
                  'deviceType': 'I'}})

self.client.post('/url/', data={'data': json.dumps(data_dict)})

ビューで:

json.loads(request.POST['data'])

これにより、post['data']が文字列として送信されます。ビューでは、その文字列からjsonをロードする必要があります。

ありがとう。

于 2014-03-24T10:51:25.577 に答える