2017-10-11 2 views
0

J'ai enfin un moyen d'accéder aux différentes valeurs de facebook en utilisant django-allauth. Le seul problème auquel je suis confronté est l'accès aux valeurs du modèle.Accéder aux valeurs json sur le modèle django

Voici le 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}) 

Voici le modèle taht J'utilise pour afficher les valeurs:

<html> 


<body> 

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


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



</body> 


</html> 

Je reçois l'erreur suivante:

S'il vous plaît laissez-moi savoir quoi améliorer.

FB - ERROR

** Erreur dans le texte **

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 

C'est le JSON je stocke dans la variable JSON: gist of the json

+1

* i.stack.imgur.com n'est actuellement pas en mesure de traiter cette demande. * La raison la plus importante pour laquelle des erreurs doivent être ajoutées dans le texte, pas en tant qu'images. –

+0

@MosesKoledoye Juste un moment, j'ajoute ... –

Répondre

1

requests.get() retourne un objet response (la représentation d'un Réponse HTTP), pas une chaîne, donc évidemment json.loads() se bloque sur elle. Ce que vous voulez ici est:

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

Maintenant requests est assez intelligent pour avoir une méthode json() qui prendra soin de la partie json.loads() si la réponse a un type de contenu « application/json », donc vous pouvez simplement l'utiliser à la place:

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

Cela dit, vous ne devriez pas prendre aveuglément votre demande a réussi - vous pourriez avoir une erreur au niveau du transport (réseau/dns/etc), ou vous pourriez avoir un 403, 404, 500 ou quelle que soit la réponse, vous devrez donc gérer tous les cas d'erreur autour de l'appel requests.get().

En dernière note: utiliser le formatage de chaînes au lieu de chaînes concaténation - il rend le code beaucoup plus lisible et maintenable:

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

FWIW vous pouvez pass the query part as a dict aussi (et il est en fait la meilleure pratique):

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') renvoie uniquement la valeur de réponse

Ex:

Ref Image: Response display

Donc, si vous utilisez requests.get, alors vous devez utiliser une fonction pour obtenir les données de la réponse.

Comme requested_data.content qui donne des données JSON et vous pouvez l'envoyer au template et l'utiliser.

J'ai utilisé ci-dessous exemple de code pour tester

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) 

et en mesure d'obtenir les données comme ci-dessous

Requested Data Content= b'{"id":"1234569789011121","name":"Soma Naresh","email":"[email protected]"}' 
Requested Data = <Response [200]> 

Laissez-moi savoir si je me trompe.