访问django模板上的json值

时间:2017-10-11 10:56:57

标签: python json django facebook

我终于有办法使用django-allauth从facebook访问各种值。我面临的唯一问题是访问模板上的值。

以下是views.py

from allauth.socialaccount.models import SocialToken

import json
import requests


def fb_personality_traits(request):
    access_token = SocialToken.objects.get(account__user=request.user, account__provider='facebook')
    # print access_token.token
    requested_data = requests.get(
        'https://graph.facebook.com/me?access_token=' + access_token.token + '&fields=id,name,email,posts,about')
    data_FB = json.loads(requested_data)
    return render(request, 'home/facebook_personality_traits.html', {'fb': data_FB})

这是我用来显示值的模板:

<html>


<body>

 Welcome back {{ user.name }}
 {{fb.name}}
<!-- <img src="" height="60" width="60"> -->


<a href="/">Home</a>



</body>


</html>

我收到以下错误:

请告诉我要改进的地方。

FB - ERROR

**文字错误**

TypeError at /facebook_personality_traits/
expected string or buffer
Request Method: GET
Request URL:    http://website:port/facebook_personality_traits/
Django Version: 1.11.5
Exception Type: TypeError
Exception Value:    
expected string or buffer
Exception Location: /usr/lib/python2.7/json/decoder.py in decode, line 364
Python Executable:  /usr/bin/python
Python Version: 2.7.12
Python Path:    
['/home/ubuntu/PersonalityWithFacebook',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages']
Server time:    Wed, 11 Oct 2017 11:00:14 +0000

这是我存储在json变量中的json:gist of the json

2 个答案:

答案 0 :(得分:1)

$(this) 返回一个requests.get()对象(HTTP响应的表示),而不是字符串,因此显然response崩溃了。你想要的是:

json.loads()

现在response = requests.get(...) fb_data = json.loads(response.text) 非常聪明,如果响应具有'application / json'内容类型,则requests方法会处理json()部分,因此您可以改为使用它:

json.loads()

这就是说,你不应盲目地假设你的请求成功 - 你可能在传输级别(网络/ DNS /等)有错误,或者你可能有403,404,500或任何响应,所以你'我必须处理response = requests.get(...) fb_data = response.json() 电话周围的所有错误案例。

作为最后一点:使用字符串格式而不是字符串连接 - 它使代码更具可读性和可维护性:

requests.get()

FWIW你也可以pass the query part as a dict(这实际上是最好的做法):

url = 'https://graph.facebook.com/me?access_token={token}&fields=id,name,email,posts,about'.format(token=access_token.token)

答案 1 :(得分:1)

requested_data = requests.get('some_url')仅返回响应值

例:

参考图片:Response display

因此,如果您正在使用requests.get,那么您必须使用一些函数来从响应中获取数据。

与requested_data.content一样,它会生成JSON数据,您可以将其发送到模板并使用。

我使用下面的示例代码来测试

import requests
import json

requested_data = requests.get('https://graph.facebook.com/me?access_token={my_fb_id_token}&fields=id,name,email')
print("Requested Data Content= %s"%requested_data.content)
print("Requested Data = %s"%requested_data)

能够获得如下数据

Requested Data Content= b'{"id":"1234569789011121","name":"Soma Naresh","email":"xxxxxxxxxx@gmail.com"}'
Requested Data = <Response [200]>

如果我错了,请告诉我。