flask: microframework para construção de aplicações web em python
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
![Page 1: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/1.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/2.jpg)
Micro?
http://www.flickr.com/photos/waisian/3590682463/
![Page 3: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/3.jpg)
http://www.flickr.com/photos/benchilada/2467374335/
Mais um framework?
![Page 4: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/4.jpg)
Por que usar um microframework?
![Page 5: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/5.jpg)
Simplicidade
http://www.flickr.com/photos/payayita/3313899667/
![Page 6: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/6.jpg)
é
simples.
mas o
![Page 7: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/7.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/8.jpg)
Bônus
http://www.flickr.com/photos/malingering/58838080/
![Page 9: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/9.jpg)
Flexibilidade
http://www.flickr.com/photos/wainwright/351684037/
![Page 10: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/10.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/11.jpg)
Simples,leve e
pequeno.
![Page 12: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/12.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/13.jpg)
Flask não é full stack
![Page 14: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/14.jpg)
Acoplamento
http://www.flickr.com/photos/inertiacreeps/1414772429/
![Page 15: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/15.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/16.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/17.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/18.jpg)
Extensível
![Page 19: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/19.jpg)
Extensões para...FormuláriosBancos de dadosTestesi18n CachingCSRFTemplating...
![Page 20: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/20.jpg)
http://www.flickr.com/photos/ntrlwmn/4103357982/
Bônus!
![Page 21: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/21.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/22.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/23.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/24.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/25.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/26.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/27.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/28.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/29.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/30.jpg)
![Page 31: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/31.jpg)
Don't repeat yourself!
● Jinja2 macros
![Page 32: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/32.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/33.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/34.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/35.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/36.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/37.jpg)
RESTful URL routing
Utilíssimo para criação de APIs =)
![Page 38: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/38.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/39.jpg)
HTML 5?
![Page 40: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/40.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/41.jpg)
![Page 42: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/42.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/43.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/44.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/45.jpg)
![Page 46: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/46.jpg)
Don't repeat yourself!
● Jinja2 macros● Herança de templates
![Page 47: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/47.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/48.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/49.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/50.jpg)
Executando a aplicação
$ python projetos.py
![Page 51: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/51.jpg)
E agora?
http://www.flickr.com/photos/smart-trips/4047872730/
![Page 52: Flask: Microframework para construção de aplicações web em Python](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/52.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/53.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/54.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020717/54b6cafe4a7959a91b8b45bd/html5/thumbnails/55.jpg)
Francisco Souza@franciscosouza
www.franciscosouza.com.br