Flask: Microframework para construção de aplicações web em Python

55
Flask Microframework para construção de aplicações web em Python Francisco Souza @franciscosouza [email protected] www.franciscosouza.com.br

description

Apresentação interna feita na Giran (http://www.giran.com.br) sobre o Flask, microframework Python para construção de aplicações web.

Transcript of Flask: Microframework para construção de aplicações web em Python

Page 1: Flask: Microframework para construção de aplicações web em Python

FlaskMicroframework para construção de

aplicações web em Python

Francisco Souza@franciscosouzafrancisco@franciscosouza.netwww.franciscosouza.com.br

Page 2: Flask: Microframework para construção de aplicações web em Python

Micro?

http://www.flickr.com/photos/waisian/3590682463/

Page 3: Flask: Microframework para construção de aplicações web em Python

http://www.flickr.com/photos/benchilada/2467374335/

Mais um framework?

Page 4: Flask: Microframework para construção de aplicações web em Python

Por que usar um microframework?

Page 5: Flask: Microframework para construção de aplicações web em Python

Simplicidade

http://www.flickr.com/photos/payayita/3313899667/

Page 6: Flask: Microframework para construção de aplicações web em Python

é

simples.

mas o

Page 7: Flask: Microframework para construção de aplicações web em Python

django helloworld

3 comandos2 linhas de configuração3 linhas de código

Page 8: Flask: Microframework para construção de aplicações web em Python

Bônus

http://www.flickr.com/photos/malingering/58838080/

Page 9: Flask: Microframework para construção de aplicações web em Python

Flexibilidade

http://www.flickr.com/photos/wainwright/351684037/

Page 10: Flask: Microframework para construção de aplicações web em Python

from flask import Flask

app = Flask('hello')

@app.route('/hello')def hello(): return 'Hello world'

app.run()

Page 11: Flask: Microframework para construção de aplicações web em Python

Simples,leve e

pequeno.

Page 12: Flask: Microframework para construção de aplicações web em Python

Não subestime os pequenos

http://www.flickr.com/photos/st3f4n/4406339573/

Page 13: Flask: Microframework para construção de aplicações web em Python

Flask não é full stack

Page 14: Flask: Microframework para construção de aplicações web em Python

Acoplamento

http://www.flickr.com/photos/inertiacreeps/1414772429/

Page 15: Flask: Microframework para construção de aplicações web em Python

Deixe um framework de persistência cuidar do seu banco de dados...

Page 16: Flask: Microframework para construção de aplicações web em Python

Deixe um framework de persistência cuidar do seu banco de dados...

seja lá qual for seu banco de dados.

Page 17: Flask: Microframework para construção de aplicações web em Python

Deixe um framework de persistência cuidar do seu banco de dados...

seja lá qual for seu banco de dados.

Page 18: Flask: Microframework para construção de aplicações web em Python

Extensível

Page 19: Flask: Microframework para construção de aplicações web em Python

Extensões para...FormuláriosBancos de dadosTestesi18n CachingCSRFTemplating...

Page 20: Flask: Microframework para construção de aplicações web em Python

http://www.flickr.com/photos/ntrlwmn/4103357982/

Bônus!

Page 21: Flask: Microframework para construção de aplicações web em Python

Um CRUD cairia bem...

$ pip install Flask Flask-WTF Flask-SQLAlchemy$ mkdir projetos$ cd projetos$ mkdir templates$ touch projetos.py

Page 22: Flask: Microframework para construção de aplicações web em Python

Um CRUD cairia bem...

$ pip install Flask Flask-WTF Flask-SQLAlchemy$ mkdir projetos$ cd projetos$ mkdir templates$ touch projetos.py

Page 23: Flask: Microframework para construção de aplicações web em Python

Criação da aplicação

from flask import Flask

app = Flask(__name__)

Page 24: Flask: Microframework para construção de aplicações web em Python

Banco de dados, com SQLAlchemy

from flaskext.sqlalchemy import SQLAlchemy

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///dados.sqlite3'db = SQLAlchemy(app)

class Projeto(db.Model): __tablename__ = 'projetos' id = db.Column(db.Integer, primary_key = True) nome = db.Column(db.String(100), nullable = False) descricao = db.Column(db.Text, nullable = False)

Page 25: Flask: Microframework para construção de aplicações web em Python

Formulários, com WTForms

from flaskext import wtf

app.config['SECRET_KEY'] = 'HSAOIHs8ashw8JSJ'app.config['CSRF_ENABLED'] = Trueapp.config['CSRF_SESSION_KEY'] = 'HSAOIHs8ashw8JSJwtforms'

class ProjetoForm(wtf.Form): nome = wtf.TextField(u'Nome', validators=[wtf.Required()]) descricao = wtf.TextAreaField(u'Descrição',

validators=[wtf.Required()])

Page 26: Flask: Microframework para construção de aplicações web em Python

Formulários a partir de

modelos

http://www.flickr.com/photos/cayusa/981372736/

Page 27: Flask: Microframework para construção de aplicações web em Python

View para exibição do formulário

from flask import render_template

@app.route('/novo_projeto')def novo_projeto(): formulario = ProjetoForm() return render_template('novo_projeto.html', form=formulario)

Page 28: Flask: Microframework para construção de aplicações web em Python

Template, com Jinja2

<html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8"/> <title>Novo projeto</title> </head> <body id=""> <h1 id="">Cadastro de novo Projeto</h1> <form action="" method="post" accept-charset="utf-8"> {{ form.csrf_token }} <p><label for="nome">{{ form.nome.label }}:</label><br /> {{ form.nome() }}</p> <p><label for="descricao">{{ form.descricao.label }}:</label><br /> {{ form.descricao() }}</p> <p><input type="submit" value="Cadastrar"/></p> </form> </body></html>

Page 29: Flask: Microframework para construção de aplicações web em Python

Template, com Jinja2

<html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8"/> <title>Novo projeto</title> </head> <body id=""> <h1 id="">Cadastro de novo Projeto</h1> <form action="" method="post" accept-charset="utf-8"> {{ form.csrf_token }} <p><label for="nome">{{ form.nome.label }}:</label><br /> {{ form.nome() }}</p> <p><label for="descricao">{{ form.descricao.label }}:</label><br /> {{ form.descricao() }}</p> <p><input type="submit" value="Cadastrar"/></p> </form> </body></html>

Page 30: Flask: Microframework para construção de aplicações web em Python
Page 31: Flask: Microframework para construção de aplicações web em Python

Don't repeat yourself!

● Jinja2 macros

Page 32: Flask: Microframework para construção de aplicações web em Python

Macro para renderizar campo do formulário

{% macro render_field(field) %} <p><label for="{{ field.id }}">{{ field.label }}:<br /> {{ field(**kwargs)|safe }} {% if field.errors %} <ul class="errors"> {% for error in field.errors %} <li>{{ error }}</li> {% endfor %} </ul> {% endif %} </p>{% endmacro %}

Page 33: Flask: Microframework para construção de aplicações web em Python

Template, com Jinja2

<html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8"/> <title>Novo projeto</title> </head> <body id=""> <h1 id="">Cadastro de novo Projeto</h1> <form action="" method="post" accept-charset="utf-8"> {{ form.csrf_token }} <p><label for="nome">{{ form.nome.label }}:</label><br /> {{ form.nome() }}</p> <p><label for="descricao">{{ form.descricao.label }}:</label><br /> {{ form.descricao() }}</p> <p><input type="submit" value="Cadastrar"/></p> </form> </body></html>

Page 34: Flask: Microframework para construção de aplicações web em Python

Template, com Jinja2 Macro

<html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8"/> <title>Novo projeto</title> </head> <body id=""> <h1 id="">Cadastro de novo Projeto</h1> <form action="" method="post" accept-charset="utf-8"> {{ form.csrf_token }} {{ render_field(form.nome) }}

{{ render_field(form.descricao) }}

<p><input type="submit" value="Cadastrar"/></p> </form> </body></html>

Page 35: Flask: Microframework para construção de aplicações web em Python

Estendendo a view para receber dados do

formulário

from flask import render_template

@app.route('/novo_projeto')def novo_projeto(): formulario = ProjetoForm() return render_template('novo_projeto.html', form=formulario)

Page 36: Flask: Microframework para construção de aplicações web em Python

Estendendo a view para receber dados do

formulário

from flask import render_template

@app.route('/novo_projeto', methods = ['GET', 'POST'])def novo_projeto(): formulario = ProjetoForm() return render_template('novo_projeto.html', form=formulario)

Page 37: Flask: Microframework para construção de aplicações web em Python

RESTful URL routing

Utilíssimo para criação de APIs =)

Page 38: Flask: Microframework para construção de aplicações web em Python

RESTful URL routing

Utilíssimo para criação de APIs =)

Problemático para trabalhar com formulários.

Page 39: Flask: Microframework para construção de aplicações web em Python

HTML 5?

Page 40: Flask: Microframework para construção de aplicações web em Python

Estendendo a view para receber dados do

formulário

from flask import render_template

@app.route('/novo_projeto', methods = ['GET', 'POST'])def novo_projeto(): formulario = ProjetoForm() if formulario.validate_on_submit(): projeto = Projeto() projeto.nome = formulario.nome.data projeto.descricao = formulario.descricao.data db.session.add(projeto) db.session.commit() return redirect(url_for('listar_projetos')) return render_template('novo_projeto.html', form=formulario)

Page 41: Flask: Microframework para construção de aplicações web em Python
Page 42: Flask: Microframework para construção de aplicações web em Python

View para listagem dos projetos

@app.route('/projetos')def listar_projetos(): projetos = Projeto.query.all() return render_template('projetos.html', projetos=projetos)

Page 43: Flask: Microframework para construção de aplicações web em Python

Template para listagem

<html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8"/> <title>Listagem de projetos</title> </head> <body id=""> <h1 id="">Listagem de projetos</h1> <ul> {% for projeto in projetos %} <li>{{ projeto.nome }}</li> {% endfor %} </ul> </body></html>

Page 44: Flask: Microframework para construção de aplicações web em Python

Template para listagem

<html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8"/> <title>Listagem de projetos</title> </head> <body id=""> <h1 id="">Listagem de projetos</h1> <ul> {% for projeto in projetos %} <li>{{ projeto.nome }}</li> {% endfor %} </ul> </body></html>

Page 45: Flask: Microframework para construção de aplicações web em Python
Page 46: Flask: Microframework para construção de aplicações web em Python

Don't repeat yourself!

● Jinja2 macros● Herança de templates

Page 47: Flask: Microframework para construção de aplicações web em Python

Template base para herança

<html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8"/> <title>{% block titulo %}{% endblock %}</title> </head> <body id=""> {% block conteudo %}{% endblock %} </body></html>

Page 48: Flask: Microframework para construção de aplicações web em Python

Template de formulário refatorado

{% extends "base.html" %}{% block titulo %} Cadastro de novo Projeto{% endblock %}

{% block conteudo %} <h1 id="">Cadastro de novo Projeto</h1> <form action="" method="post" accept-charset="utf-8"> {{ form.hidden_tag() }} {{ render_field(form.nome) }} {{ render_field(form.descricao) }} <p><input type="submit" value="Cadastrar"/></p> </form>{% endblock %}

Page 49: Flask: Microframework para construção de aplicações web em Python

Template de listagem refatorado

{% extends "base.html" %}{% block titulo %} Listagem de projetos{% endblock %}

{% block conteudo %} <h1 id="">Listagem de projetos</h1> <ul> {% for projeto in projetos %} <li>{{ projeto.nome }}</li> {% endfor %} </ul>{% endblock %}

Page 50: Flask: Microframework para construção de aplicações web em Python

Executando a aplicação

$ python projetos.py

Page 51: Flask: Microframework para construção de aplicações web em Python

E agora?

http://www.flickr.com/photos/smart-trips/4047872730/

Page 52: Flask: Microframework para construção de aplicações web em Python

E agora?

http://www.flickr.com/photos/smart-trips/4047872730/

flask.pocoo.org

Page 53: Flask: Microframework para construção de aplicações web em Python

E agora?

http://www.flickr.com/photos/smart-trips/4047872730/

flask.pocoo.org

werkzeug.pocoo.org

Page 54: Flask: Microframework para construção de aplicações web em Python

E agora?

http://www.flickr.com/photos/smart-trips/4047872730/

flask.pocoo.org

werkzeug.pocoo.org

jinja.pocoo.org/2

Page 55: Flask: Microframework para construção de aplicações web em Python

Francisco Souza@franciscosouza

www.franciscosouza.com.br