Flask: Microframework para construção de aplicações web em Python
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

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

  • 4,035 views
Uploaded on

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

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
4,035
On Slideshare
4,033
From Embeds
2
Number of Embeds
1

Actions

Shares
Downloads
81
Comments
0
Likes
2

Embeds 2

http://www.linkedin.com 2

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Flask Microframework para construção de aplicações web em Python Francisco Souza @franciscosouza francisco@franciscosouza.net www.franciscosouza.com.br
  • 2. http://www.flickr.com/photos/waisian/3590682463/ Micro?
  • 3. Mais um framework? http://www.flickr.com/photos/benchilada/2467374335/
  • 4. Por que usar um microframework?
  • 5. http://www.flickr.com/photos/payayita/3313899667/ Simplicidade
  • 6. mas o é simples.
  • 7. django helloworld 3 comandos 2 linhas de configuração 3 linhas de código
  • 8. Bônus http://www.flickr.com/photos/malingering/58838080/
  • 9. Flexibilidade http://www.flickr.com/photos/wainwright/351684037/
  • 10. from flask import Flask app = Flask('hello') @app.route('/hello') def hello(): return 'Hello world' app.run()
  • 11. Simples, leve e pequeno.
  • 12. http://www.flickr.com/photos/st3f4n/4406339573/ Não subestime os pequenos
  • 13. Flask não é full stack
  • 14. Acoplamento http://www.flickr.com/photos/inertiacreeps/1414772429/
  • 15. Deixe um framework de persistência cuidar do seu banco de dados...
  • 16. Deixe um framework de persistência cuidar do seu banco de dados... seja lá qual for seu banco de dados.
  • 17. Deixe um framework de persistência cuidar do seu banco de dados... seja lá qual for seu banco de dados.
  • 18. Extensível
  • 19. Extensões para... Formulários Bancos de dados Testes i18n Caching CSRF Templating ...
  • 20. http://www.flickr.com/photos/ntrlwmn/4103357982/ Bônus!
  • 21. Um CRUD cairia bem... $ pip install Flask Flask-WTF Flask-SQLAlchemy $ mkdir projetos $ cd projetos $ mkdir templates $ touch projetos.py
  • 22. Um CRUD cairia bem... $ pip install Flask Flask-WTF Flask-SQLAlchemy $ mkdir projetos $ cd projetos $ mkdir templates $ touch projetos.py
  • 23. Criação da aplicação from flask import Flask app = Flask(__name__)
  • 24. 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)
  • 25. Formulários, com WTForms from flaskext import wtf app.config['SECRET_KEY'] = 'HSAOIHs8ashw8JSJ' app.config['CSRF_ENABLED'] = True app.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()])
  • 26. http://www.flickr.com/photos/cayusa/981372736/ Formulários a partir de modelos
  • 27. 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)
  • 28. 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>
  • 29. 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>
  • 30. Don't repeat yourself! ● Jinja2 macros
  • 31. 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 %}
  • 32. 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>
  • 33. 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>
  • 34. 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)
  • 35. 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)
  • 36. RESTful URL routing Utilíssimo para criação de APIs =)
  • 37. RESTful URL routing Utilíssimo para criação de APIs =) Problemático para trabalhar com formulários.
  • 38. HTML 5?
  • 39. 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)
  • 40. View para listagem dos projetos @app.route('/projetos') def listar_projetos(): projetos = Projeto.query.all() return render_template('projetos.html', projetos=projetos)
  • 41. 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>
  • 42. 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>
  • 43. Don't repeat yourself! ● Jinja2 macros ● Herança de templates
  • 44. 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>
  • 45. 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 %}
  • 46. 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 %}
  • 47. Executando a aplicação $ python projetos.py
  • 48. http://www.flickr.com/photos/smart-trips/4047872730/ E agora?
  • 49. http://www.flickr.com/photos/smart-trips/4047872730/ flask.pocoo.org E agora?
  • 50. http://www.flickr.com/photos/smart-trips/4047872730/ flask.pocoo.org werkzeug.pocoo.org E agora?
  • 51. http://www.flickr.com/photos/smart-trips/4047872730/ flask.pocoo.org werkzeug.pocoo.org jinja.pocoo.org/2 E agora?
  • 52. Francisco Souza @franciscosouza www.franciscosouza.com.br