I\'m playing with a url shortener (basing it on the Shortly demo app from Werkzeug).
I have a dict like this -
(\'1\', {\'target\': \'http://10.
Please note that dict.items()
method is exists in both Python 2 and Python 3. But the method gives no warranties about the order items contained in dictionary are being iterated. This is why it could make more sense for this example to use a list of dictionaries instead of a dictionary of dictionaries like you said above.
Your url_list
should look like this:
url_list = [{'target': 'http://10.58.48.103:5000/', 'clicks': '1'},
{'target': 'http://slash.org', 'clicks': '4'},
{'target': 'http://10.58.48.58:5000/', 'clicks': '1'},
{'target': 'http://de.com/a', 'clicks': '0'}]
Then using:
<li>{{ item["target"] }}</li>
in your template will work.
Your template think you're passing a list in, so are you sure you're passing in your original dict and not my above list?
Also you need to access both a key
and a value
in your dictionary (when you're passing a dictionary rather than a list):
Python 2.7
{% for key, value in url_list.iteritems() %}
<li>{{ value["target"] }}</li>
{% endfor %}
Python 3
{% for key, value in url_list.items() %}
<li>{{ value["target"] }}</li>
{% endfor %}
One approach is to cleanly separate processing logic from the HTML. Thus, put HTML in a separate file, such as, top.reddit.html
. But content within the HTML is dynamic since it's pulled from Reddit. So we use Jinja2 as the templating engine. This implies that top.reddit.html
is just the template but not the final content to be served.
top.reddit.html (showing only the dynamic rows here for brevity):
{% for item in data %}
<tr>
<td width="0%"> </td>
<td>{{item["date"]}}, {{item["title"]}}<br>{{item["teaser"]}}</td>
<td width="0%"> </td>
</tr>
{% endfor %}
Python code to render the template (tested with Python 3.5.6, Jinja2 2.10):
import jinja2
# For illustration: list of dict
top_posts = [
{'date': '06 Jun, 11:40AM', 'title': 'Title 1 goes here', 'teaser': 'One blah blah blah...'},
{'date': '05 Jun, 04:50PM', 'title': 'Title 2 goes here', 'teaser': 'Two blah blah blah...'},
{'date': '05 Jun, 09:60AM', 'title': 'Title 3 goes here', 'teaser': 'Three blah blah blah...'}
]
loader = jinja2.FileSystemLoader(searchpath="./")
jenv = jinja2.Environment(loader=loader)
template = jenv.get_template('top.reddit.html')
htmlout = template.render(data=top_posts)
print(htmlout)