包含键的JSON数据的KeyError

时间:2015-03-17 07:37:27

标签: python json facebook

我正在使用Flask中的应用程序并希望为用户添加Facebook个人资料照片。由于我有用户' Facebook ID,我发现通过Facebook Graph访问照片非常简单,它通过此URL返回JSON数据:

img_url = 'http://graph.facebook.com/%s/picture?width=%d&height=%d&redirect=false' \
            % (fb_id, width, height)

这里是img_url应该返回的JSON数据:

{
   "data": {
      "height": 200,
      "is_silhouette": false,
      "url": "JPG_URL_HERE",
      "width": 200
   }
}

对于特定的图片网址,我使用Requests获取带有unicode对象的Python字典。

r = requests.get(img_url).json()
return r['data']['url'].encode('utf-8')

所有这些在Python解释器中都能正常工作,并返回带有图像URL的字符串。但是当我使用Vagrant中的代码运行应用程序时,我得到了数据'的KeyError。对于出了什么问题的任何想法?

  File "/vagrant/app/templates/user/profile.html", line 1, in top-level template code
    {% extends "base.html" %}
  File "/vagrant/app/templates/base.html", line 38, in top-level template code
    {% block content %}{% endblock %}
  File "/vagrant/app/templates/user/profile.html", line 9, in block "content"
    <p><img src="{{ current_user.picture(200, 200) }}"></p><br>
  File "/vagrant/app/models.py", line 52, in picture
    return r['data']['url'].encode('utf-8')
  KeyError: 'data'

1 个答案:

答案 0 :(得分:0)

在您的密码中:

    r = requests.get(img_url).json()`

我认为r可能会导致str类型,因此您应该将其翻译成dict,如下所示:

    import json
    r = requests.get(img_url).json()
    r_dict = json.loads(r)
    return r_dict['data']['url'].encode('utf-8')

试一试。