从Jinja模板中的DynamoDB渲染数据

时间:2016-02-18 20:45:22

标签: python json flask jinja2 boto3

我有一个Flask路由,使用boto3对AWS DynamoDB进行身份验证和连接,并通过扫描整个表来拉取整个表,并将结果作为JSON返回。我希望将结果呈现为HTML,但是将JSON传递给render_template不起作用,我得到500内部服务器错误。如何呈现数据?

@app.route("/x/")
def x():
    #Authentication and connection omitted
    table = dynamodb.Table(table_name)
    response = table.scan()
    js = json.dump(response)
    #return js
    return render_template('test.html', data=js)
<ul>
{% for item in data %}
    <li>{{ item.Make}}</li>
    <li>{{ item.Model}}</li>
    <li>{{ item.Year}}</li>
{% endfor %}
</ul>

我想输出这样的数据:

Honda
Civic
2013

Toyota
Camry
1999

JSON数据:

{
  "Count": 2, 
  "Items": [
    {
      "Make": "Honda", 
      "Model": "Civic", 
      "Year": "2013"
    }, 
    {
      "Make": "Toyota", 
      "Model": "Camry", 
      "Year": "1999"
    }
  ], 
  "ResponseMetadata": {
    "HTTPStatusCode": 200, 
    "RequestId": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
  }, 
  "ScannedCount": 2
}

1 个答案:

答案 0 :(得分:1)

如果您要以HTML格式呈现数据,请不要将其转储为JSON字符串。你拥有的数据是一本字典,迭代它在这种情况下没有意义。您希望迭代该字典中items的值。

@app.route("/")
def index():
    ...
    response = table.scan()
    return render_template('index.html', data=data)
<table>
<thead><tr><th>Make</th><th>Model></th><th>Year</th></tr></thead>
<tbody>{% for item in data['items'] %}<tr>
    <td>{% item['Make'] %}</td>
    <td>{% item['Model'] %}</td>
    <td>{% item['Year'] %}</td>
</tr>{% endfor %}</tbody>
</table>