在POST请求中将字符串转换为字符串,但将其保留为列表则不起作用

时间:2018-03-23 01:15:51

标签: python django

我正在试图弄清楚为什么这构成了有效的POST请求:

    pk = 5
    data = {
        'ids': str([pk]),
        'latitude': 0,
        'longitude': 0,
    }
    response = self.client.post(
        '/api/{}/endpoint'.format(settings.DEFAULT_VERSION),
        data=json.dumps(data, indent=4),
        content_type='application/json',
        HTTP_AUTHENTICATION=user.access_token,
    )

而这不是:

    pk = 5
    data = {
        'ids': [pk],
        'latitude': 0,
        'longitude': 0,
    }
    response = self.client.post(
        '/api/{}/endpoint'.format(settings.DEFAULT_VERSION),
        data=json.dumps(data, indent=4),
        content_type='application/json',
        HTTP_AUTHENTICATION=user.access_token,
    )

后者导致以下错误:“TypeError:期望的字符串或缓冲区”。

在服务器端,第二行似乎失败了:

    ids_json = request.data.get('ids')
    ids = json.loads(ids_json)

我不确定为什么将'ids'列表作为字符串生效,但将其保留为列表却不行。

3 个答案:

答案 0 :(得分:2)

这些是不同的jsons:

pk = 5
data = {
    'ids': str([pk]),
    'latitude': 0,
    'longitude': 0,
}
# json = {"latitude": 0, "longitude": 0, "ids": "[5]"}

虽然:

pk = 5
data = {
    'ids': [pk],
    'latitude': 0,
    'longitude': 0,
}
# json = {"latitude": 0, "longitude": 0, "ids": [5]}

第一个实际上是一个字符串,所以你可以将它进一步传递给“json.loads”。第二个是列表。

答案 1 :(得分:1)

两者都是有效的邮寄请求。

使用json.loads(ids_json),您希望ids_json成为字符串。

json.loads将字符串解析为json

答案 2 :(得分:1)

pk = 5
data = {
    'ids': [pk],
    'latitude': 0,
    'longitude': 0,
}
response = self.client.post(
    '/api/{}/endpoint'.format(settings.DEFAULT_VERSION),
    data=json.dumps(data, indent=4),
    content_type='application/json',
    HTTP_AUTHENTICATION=peep.access_token,
)

# on server side, it seem like the request.data is already a dict type.
ids_json = request.data.get('ids')
# so ids_json is should be a list type, which you want to get.