2013-03-17 21 views
1

免責聲明:我完全不熟悉解析和訪問JSON,我只是開始獲得django的繩索。使用Django訪問JSON數據

詳情:

我試圖訪問內部的JSON對象我在Django模板獲得的一些數據:

例如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"},]} 
]} 

得到Django的模板標籤:

@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,這和保存的結果,因爲它是不太可能改變。數據庫訪問比JSON請求更快...多數民衆贊成只是我的2C雖然 – 2013-03-17 19:10:36

回答

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個網址: and follow John on facebook, linkedin, and twitter.

0

對於以逗號分隔的列表中,您使用來自Django的(https://docs.djangoproject.com/en/dev/ref/templates/builtins/)的join模板標籤:

{{ accounts|join:", " }} 

如果你想要去更看中的,你可以寫自己的模板標籤(並不困難,因爲它似乎!)。

+0

謝謝,但你是對的我需要寫一個模板標籤,以得到這個工作,我想如何 – frankV 2013-03-17 20:44:18