2017-10-11 12 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.loads()一部の世話をしますjson()方法を持っているのに十分スマートですので、あなたはそれを使用することができます代わりに:これは言われている

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')は、応答値

例を返す:

参考画像:Response display

ですから、requests.getを使用している場合は、応答からデータを取得するために、いくつかの機能を使用する必要があります。

JSONデータの結果のrequested_data.contentと同様です。これをテンプレートに送信して使用することができます。

私は

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]> 

以下のようなデータは、私が間違っている場合は、私に教えてください取得することができをテストするために、サンプルコードの下に使用されてきました。

関連する問題