Upload
helder-vieira
View
217
Download
6
Embed Size (px)
DESCRIPTION
Nesta apresentação, faremos um breve tour sobre esta ferramenta abordando, de forma prática, sua utilização e integração com tecnologias afins, como engine de templates, mapeamento objeto-relacional e gerador de formulários. Apresentação realizada em 29/07/2014 na Worksigma http://worksigma.unisigma.com.br/
Citation preview
Criação de aplicações web com pythonutilizando o micro-framework Flask.
@HelderVieira● Tecnólogo em SI (IFPB)● Pythonista● Analista da CODATA● Empreendedor● Estudante de Gestão
Pública● Músico católico● Flamengo
Python
● Linguagem de Programação de alto nível● Interpretada● Imperativa● Orientada a objetos● Funcional● Tipagem dinâmica e forte● Multiplataforma● Multiparadigma
Flask
● Pocoo project● Criado por Armin Ronacher
○ PSF Membership Roster desde 2012● Lançado em 1º de abril de 2010● Versão atual 0.10.1● Licença BSD
http://flask.pocoo.org/
Cinto de utilidades
virtualenv
Version-Control
Python pip
PyCharm
ORM Google-ChromeBootstrap
jQuery
JSON/XML
$ virtualenv env
$ env/bin/python pip install Flask$ env/bin/python hello.py * Running on http://localhost:5000/
Startando a aplicação...
from flask import Flaskapp = Flask(__name__)
@app.route("/")def hello(): return "Hello World!"
if __name__ == "__main__": app.run()
Extensões
● Admin● i18n● CouchDB● Debug / Testes● GAE● Genshi● Gravatar
● Heroku● Login● Mail● Mako● MongoDB● OAuth● OpenID
Continua...
Configurando o
from flask_sqlalchemy import SQLAlchemy
app.config[“SQLALCHEMY_DATABASE_URI”] = 'sqlite:///app.db'
db = SQLAlchemy(app)
$ env/bin/pip install Flask-SQLAlchemy
Classe Mapeada com SQLAlchemyclass Cidade(db.Model):
__tablename__ = 'cidade'
id = db.Column("id_cidade", db.Integer, db.Sequence('seq_cidade'), primary_key=True)
nome = db.Column(db.String(40), nullable=False )
uf = db.Column(db.String(2), nullable=False, default="PB")
def __unicode__(self): return self.nome
Formulários com
$ env/bin/pip install Flask-WTF
from wtforms import DateFieldfrom wtforms import FormFieldfrom wtforms import HiddenFieldfrom wtforms import IntegerFieldfrom wtforms import TextAreaFieldfrom wtforms import TextFieldfrom wtforms import validators as vfrom wtforms.ext.sqlalchemy.fields import QuerySelectField
class ItemRequisicaoForm(Form):
grupo_controle = QuerySelectField( u"Grupo de Controle", query_factory=lambda: db.session.query(GrupoControleMaterial).order_by('nome'), allow_blank=True, blank_text=u"Selecione...", validators=[ v.Required(u'Este campo é de preenchimento obrigatório.') ] ) id_material = SelectField( u'Prescrição', choices=[], default=0, coerce=int, validators=[ v.Required(u'Este campo é de preenchimento obrigatório.') ] ) quantidade = IntegerField(u'Quantidade') posologia = TextField() aprazamento = TextField()
Templates com o Jinja2{% extends "main_template.html" %}
{% from "macros/form_field.html" import form_field, horizontal_form_field %}
{% block contentArea %}
<form id="form-default" class="form-horizontal" method="POST" role="form">
{% for field in form %}
{% if field.id != 'csrf_token' %}
{{ form_field(field) }}
{% else %}
{{ form.hidden_tag() }}
{% endif %}
{% endfor %}
</form>
{% endblock %}
Fazendo algo novo...
from flask import render_template
@app.route("/formulario")
def formulario():
form = ItemRequisicaoForm()
return render_template(“formulario.html”,
form=form)
DRY!Don’t repeat yourself!
@app.route("/formulario", methods=['GET', 'POST'])
def formulario():
form = ItemRequisicaoForm()
if form.validate_on_submit():
new_item = ItemRequisicao()
form.populate_obj(new_item)
db.session.add(new_item)
db.session.commit()
flash(u'Os dados foram inseridos com sucesso!')
return redirect(url_for(‘index’))
else:
flash(u'Verifique os dados!')
return render_template(“formulario.html”, form=form)
Para onde ir a partir daqui?
flask.pocoo.org
python.org
jinja.pocoo.org
wtforms.readthedocs.org