Render Web Template com Python Flask

Geração de template HTML com Python Flask

Entregar páginas Web interpretando como se fossem estáticas, reduz a carga de processamento pelo cliente, executando pelo servidor onde pode estar a base de dados e outros recursos, podendo ser disponíveis somente neste ambiente

Montagem do Modelo

Fazendo uso do Jinja, um modelo de sintaxe e semântica, montamos um documento HTML, fazendo uso de delimitadores para expressões {{ e }} e controles de fluxo {% e %}
Inserir um valor direto no corpo do arquivo

<!DOCTYPE html>
<h1>Hello {{ nome }}</h1>

Com o uso de if mudamos o fluxo de treços de código

<!DOCTYPE html>
{% if nome %}
<h1>Hello {{ nome }}!</h1>
{% else %}
<h1>Hello, World!</h1>
{% endif %}

ou por uso de if ternário, seguindo o padrão do Python

<!DOCTYPE html>
<h1>Hello, {{ nome if nome else 'World'}}!</h1>

Através da iteração de uma lista de objetos, salvando na pasta de template com o nome de lista.html

<!DOCTYPE html>
<ul id="navigation">
  {% for item in navigation %}
  <li><a href="{{ item.href }}">{{ item.caption }}</a></li>
  {% endfor %}
</ul>

Com o uso um modelo padrão, salvando na pasta de template com o nome de base.html

<!doctype html>
  <h1>{% block titulo %}{% endblock %}</h1>

  <div class="wrapper">
    {% block corpo %}{% endblock %}
  </div

As definições de bloco {% block titulo %} e {% block corpo %} podem ser preenchidas por qualquer página ao estender o documento de base, vamos fazer isso no lista.html

{% extends 'base.html' %} {% block titulo %} Página Teste {% endblock %} {%
block corpo %}
<ul id="navigation">
  {% for item in navigation %}
  <li><a href="{{ item.href }}">{{ item.caption }}</a></li>
  {% endfor %}
</ul>
{% endblock %}

A estrutura de arquivos deve ficar assim:

/app.py /templates /hello.html /lista.html /base.html

Preparação

Instalar o pelo gerenciador de pacotes, recomendo o uso de Ambiente Virtual

pip install flask

Iniciando o arquivo app.py com a declaração do flask

from flask import Flask
app = Flask(__name__)

Interpretação

Adicionando no arquivo app.py a opção de rotas para ouvir o caminho /hello/ com e sem parâmetros

from flask import render_template

@app.route('/hello/')
@app.route('/hello/<param>')
def hello(param=None):
    return render_template('hello.html', nome=param)

Também adicionando no arquivo app.py a /lista/ passando a listagem em navigation como fixa para ilustração

from flask import render_template

@app.route('/lista/')
def lista():
    list = [
        {"href":"#1", "caption":"primeiro"},
        {"href":"#2", "caption":"segundo"}
    ]
    return render_template('lista.html', navigation=list)

Arquivos Estáticos

Folhas de estilo não costumam sofre variação na execução do sistema, não sendo necessária a interpretação da mesma Para entregar devemos adicionar na pasta static na raiz do projeto

/app.py /templates /static /style.css

E adiciona o trecho na página HTML

<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}" />

ou direto no intepretador, e informando o caminho /static/style.css, mas desta maneira é necessário definir um contexto como no exemplo abaixo

from flask import url_for
app.config['SERVER_NAME'] = "127.0.0.1:5000"

with app.app_context():
  url_for('static', filename='style.css')

Favicon

Para adicionar o favicon.ico na página basta colocar o arquivo na pasta static e adicionar o trecho no texto do HTML

<link
  rel="shortcut icon"
  href="{{ url_for('static', filename='favicon.ico') }}"
/>

Execução

Se o pacote do flask estiver instalado e arquivo nomeado como app.py, basta executar o comando abaixo ou rodar python <nome do arquivo> para outro nome de arquivo

flask run

Uma mensagem no shell apresenta que o site está disponível no localhost:5000, acesse os endereços para visualizar os resultados

Referências

Flask - Quickstart

Flask - Templates

Flask - Static Files

Jinja - Template Designer Documentation

Compartilhe:

Algumas recomendações

{JWA}

Johny W. Alves | Web Developer