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

4,179 views
4,025 views

Published on

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

Published in: Technology
1 Comment
4 Likes
Statistics
Notes
No Downloads
Views
Total views
4,179
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
102
Comments
1
Likes
4
Embeds 0
No embeds

No notes for slide

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

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

×