2017-10-11 69 views
0

我終於有了一種方法來使用django-allauth訪問facebook上的各種值。我面臨的唯一問題是訪問模板上的值。在Django模板上訪問json值

這裏是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}) 

這裏是taht我使用的顯示值模板:

<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

+1

* i.stack.imgur.com目前無法處理此請求。*更之所以錯誤應該被添加作爲文本的一部分,而不是圖像。 –

+0

@MosesKoledoye等一下我加入... –

回答

1

requests.get()返回response對象(的表示HTTP響應),而不是一個字符串,所以顯然json.loads()崩潰了。你想要的這裏是:

response = requests.get(...) 
fb_data = json.loads(response.text) 

現在requests是足夠聰明,有json()方法如果響應具有「應用/ JSON的」內容類型會照顧json.loads()部分的,所以你可以使用它而不是:

response = requests.get(...) 
fb_data = response.json() 

這是說,你不應該盲目地假設你的請求成功 - 你可以有在傳輸層的錯誤(網絡/ DNS /等),或者你可以有一個403,404,500或無論什麼響應,所以你必須處理所有關於requests.get()調用的錯誤情況。

作爲最後一個音符:使用字符串格式化而不是字符串拼接 - 它使代碼更可讀和可維護:

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

FWIW你可以pass the query part as a dict太(和它的實際的最佳實踐):

url = 'https://graph.facebook.com/me' 
params = { 
    "access_token": access_token.token, 
    "fields": "id,name,email,posts,about" 
    } 
response = requests.get(url, params=params) 
1

requested_data = requests.get( 'SOME_URL')僅返回響應值

例如:

Ref圖像: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":"[email protected]"}' 
Requested Data = <Response [200]> 

讓我知道,如果我錯了的數據。