site que e um aplicativo grande que tem dezenas de views, cada uma retornando HTML diretamente? Esta, claramente, nao e uma opcao escalavel.Templates ao resgateSe voce pudesse manter a logica do seu aplicativo separado do layout ou apresentacao de suas paginas web as coisas seriam muito mais bem organizadas, voce nao acha? Voce poderia ate mesmo contratar um web designer para criar um web site matador enquanto voce codificaria os comportamentos do site em Python. Templates servem para implementar esta separacao.Vamos escrever nosso primeiro template (arquivo app/templates/index.html)<html> <head> <title>{{title}} - microblog</title> </head> <body> <h1>Hello, {{user.nickname}}!</h1> </body></html>Como voce pode ver acima, apenas escrevemos uma pagina HTML padrao. A unica diferenca e que ha alguns espacos reservados para o conteudo dinamico delimitados por {{ ... }}.Agora vamos ver como usariamos este template em nossa view (arquivo app/views.py):from flask import render_templatefrom app import app@app.route('/')@app.route('/index')def index(): user = { 'nickname': 'Miguel' } # fake user return render_template("index.html", title = 'Home', user = user)Teste a aplicacao neste momento para ver como o template funciona. Depois de ter a pagina renderizada em seu navegador voce pode querer inspecionar o codigo HTML e compara-la com o template original.Para renderizar o template tivemos que importar uma nova funcao do Flask chamada render_template. Esta funcao recebe como parametros o nome de um template e uma lista com os argumentos do template e o retorna renderizado, com todos os argumentos substituidos.Por baixo dos panos, a funcao render_template chama o mecanismo de templates Jinja2 que faz parte do Flask. O Jinja2 substitui os blocos {{...}} pelos valores correspondentes fornecidos como argumentos do template.Instrucoes de controle em TemplatesOs templates Jinja2 tambem suportam instrucoes de controle escritos dentro de blocos delimitados por {% ... %}. Vamos adicionar uma instrucao 'if' ao nosso template (arquivo app/templates/index.html):<html> <head> {% if title %} <title>{{title}} - microblog</title> {% else %} <title>Welcome to microblog</title> {% endif %} </head> <body> <h1>Hello, {{user.nickname}}!</h1> </body></html>Agora, o nosso template e um pouco mais inteligente. Se a na definicao da view for omitida a atribuicao do titulo da pagina, em vez de gerar uma excecao o template ira fornecer seu proprio titulo. Sinta-se livre para remover o argumento titulo na chamada do render_template da nossa view para ver como funciona a clausula IF.Loops em templatesO usuario conectado em nosso aplicativo microblog provavelmente vai querer ver os posts recentes dos seus contatos em sua home page, entao vamos ver como podemos fazer isso.Para comecar, usaremos o truque do fake object para criar alguns usuarios e posts para mostrar (arquivo app/views.py):def index(): user = { 'nickname': 'Miguel' } # fake user posts = [ # fake array of posts { 'author': { 'nickname': 'John' }, 'body': 'Beautiful day in Portland!' }, { 'author': { 'nickname': 'Susan' }, 'body': 'The Avengers movie was so cool!' } ] return render_template("index.html", title = 'Home', user = user, posts = posts)Para representar mensagens dos usuarios nos usamos uma lista onde cada elemento tem os campos autor e corpo. Quando nos comecarmos a implementar um banco de dados real iremos preservar esses nomes de campo para que possamos projetar e testar nosso