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

on

  • 3,956 views

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.

Statistics

Views

Total Views
3,956
Views on SlideShare
3,954
Embed Views
2

Actions

Likes
2
Downloads
79
Comments
0

1 Embed 2

http://www.linkedin.com 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Flask: Microframework para construção de aplicações web em Python Presentation 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