[Flask + Jinja2] Injetando variáveis no contexto da view

Em alguns momentos precisamos de uma mesma informação para ser exibida em todas as paginas, o Flask tem uma solução para isso.

Vamos imaginar que estamos fazendo uma aplicação, e que por algum motivo queremos exibir em todas as views o nome de nossa empresa. Normalmente teríamos que fazer da seguinte forma:

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html', company_name="My Company Inc.")

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True, port=8080)

Agora imagine, que você precise fazer isso para diversas views, realmente ficará trabalhoso e sujeito a erros.

Para resolver esse problema no Flask temos um recurso chamado Context Processor, que te ajuda a registrar variáveis de contexto para sua aplicação.

Basicamente você cria uma função que retornar um dict com chave e conteúdo. Em nosso caso vamos criar uma função chamada company_context que retorna um dict com um elemento com chave company_name.

Alterando nosso exemplo inicial ficará da seguinte maneira.

from flask import Flask, render_template

app = Flask(__name__)

@app.context_processor
def company_context():
    return dict(company_name="My Company Inc.")

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/admin')
def admin():
    return render_template('admin.html')

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True, port=8080)

Como pode perceber não é necessário mais passar como parâmetro company_name, e mesmo assim ele está disponível no contexto tanto da view index quanto da admin.

Obvio que esse meu exemplo é puramente para ser didático. por tanto não segue qualquer boa prática.

Qualquer dúvida ou sugestão não hesite em usar os comentários.

Comecei a programar com 15 anos de idade e nunca mais parei.
Programador C# profissionalmente, e Python por opção.
  • Alisson Machado

    Muito bom mano!

    • http://bloegchat.com Hederson Boechat

      Obrigado =)
      To me esforçando para fazer um conteúdo relevante.

%d blogueiros gostam disto: