2013-03-17 2 views
1

Отказ от ответственности: Я совершенно не знаком с разбором и доступом к JSON, и я только начинаю получать канаты django.Доступ к данным JSON с Django

Детали:

Я пытаюсь получить доступ к некоторым данным внутри объекта JSON я получить в шаблоне Джанго:

пример JSON:

{"entry":[ 
{"id":"1234567","hash":"1234567", 
..."name":{"givenName":"John","familyName":"Doel","formatted":"John H. Doe"}, 
..."currentLocation":"Los Angeles, CA", 
..."emails":[{"primary":"true","value":"[email protected]"}], 
..."accounts":[ 
    ...{"domain":"facebook.com","url":"http:\/\/www.facebook.com\/john.doe",..."shortname":"facebook"}, 
    ...{"domain":"twitter.com","display":"@jdoe411","url":"http:\/\/twitter.com\/jdoe411",..."shortname":"twitter"}], 
..."urls":[{"value":"http:\/\/www.example.com","title":"example url"},]} 
]} 

Получено с Джанго Шаблон Тег:

@register.inclusion_tag('includes/gravatar_links.html') 
def gravatar_links(email, first_name): 
    url = "http://www.gravatar.com/" + hashlib.md5(email.lower()).hexdigest() 
    url += '.json' 

    response = urllib2.urlopen(url) 
    interm = simplejson.load(response) 
    data = simplejson.dumps(interm) 
    name = first_name 

return {'gravatar_links': {'name': name, 'data': data}} 

, который я просто вызываю {{ gravatar_links.name }} и {{ gravatar_links.data }}, и я могу видеть имя пользователя и данные JSON, как описано.

Цель:

Я хочу, чтобы получить доступ к определенным ключи в объекте JSON, а именно "accounts" и "urls" и настроить вывод (например) "Follow {{ gravatar_links.name }} on <a href="{{ gravatar_links.data.accounts.url }}">{{ gravatar_links.data.accounts.shortname }}</a> and see their work at <a href="{{ gravatar_links.data.urls.url }}">{{ gravatar_links.data.urls.title }}</a>"

который в идеале будет производить:

"Follow John on Twitter and Facebook and see their work at example url"

Вопросы:

  1. Должен ли я использовать django/python для этого, или это что-то лучше обрабатывается jQuery?
  2. Если "accounts" пришел как список, как я могу его вывести в виде списка, разделенного запятой?
  3. Есть ли проблемы с безопасностью, о которых я должен знать с помощью этого метода?
+0

Я бы, наверное, просто использовать Python для этого и сохранить результаты, так как это, скорее всего, изменения не , DB доступ быстрее, чем запрос json ... это только мой 2c, хотя –

ответ

0

шаблонный тег должен был быть:

@register.inclusion_tag('includes/gravatar_links.html') 
def gravatar_links(email, first_name): 
    url = "http://www.gravatar.com/" + hashlib.md5(email.lower()).hexdigest() 
    url += '.json' 

    response = urllib2.urlopen(url) 
    interm = simplejson.load(response) 
    accounts_list = interm["entry"][0]["accounts"] 
    data = simplejson.dumps(interm) 

    return {'gravatar_links': {'accounts': accounts_list, 'name': first_name, 'data': data}} 

, а затем получить доступ к элементам объекта JSon мы можем продолжать использовать что-то вроде accounts_list = interm["entry"][0]["accounts"] кроме с "urls" мы бы urls_list = interm["entry"][0]["urls"]

для элементов с более чем один из возможных dictionary[element: {key1=>value1, ...}, {key2=>value2, ...}] просто настройте цикл for в своем шаблоне и проведите следующие пункты:

and follow {{ gravatar_links.name }} on 

{% for o in gravatar_links.accounts %} 
    {% if not forloop.first and not forloop.last %}, {% endif %} 
    {% if forloop.last %} and {% endif %} 

    <a href="{{ o.url }}">{{ o.shortname }}</a> 

    {% if forloop.last %}.{% endif %} 
{% endfor %} 

дополнительные if forloop заявления составит наш вывод:

and follow John on facebook and twitter.

более 2 URLs: and follow John on facebook, linkedin, and twitter.

0

Для вашего списка разделенных запятыми использовать join тег шаблона из Джанго (https://docs.djangoproject.com/en/dev/ref/templates/builtins/):

{{ accounts|join:", " }} 

Если вы хотите идти больше фантазии, вы можете написать свой собственный шаблон тег (не так сложно, как это выглядит!).

+0

спасибо, но вы правы Мне нужно было написать тег шаблона, чтобы получить эту работу, как я хочу – frankV

Смежные вопросы