1

免责声明:我对解析和访问 JSON 完全陌生,而且我才刚刚开始了解 django。

细节:

我正在尝试访问我在 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":"jdoe@example.com"}],
..."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 }}and {{ gravatar_links.data }},我可以看到用户名和所描述的 JSON 数据。

目标:

我想访问 JSON 对象中的特定键,即"accounts"and "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. 使用此方法是否有任何我应该注意的安全问题?
4

2 回答 2

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.

于 2013-03-17T20:55:07.907 回答
0

对于逗号分隔的列表,您使用join来自 Django 的模板标签(https://docs.djangoproject.com/en/dev/ref/templates/builtins/):

{{ accounts|join:", " }}

如果您想更花哨,您可以编写自己的模板标签(并不像看起来那么难!)。

于 2013-03-17T20:08:08.243 回答