我终于有办法使用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>
我收到以下错误:
请告诉我要改进的地方。
**文字错误**
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
答案 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]>
如果我错了,请告诉我。