Your SlideShare is downloading. ×
0
Flask
     Microframework para construção de
         aplicações web em Python

Francisco Souza
@franciscosouza
francisco@...
http://www.flickr.com/photos/waisian/3590682463/




                                                   Micro?
Mais um
                                                      framework?




http://www.flickr.com/photos/benchilada/24673...
Por que usar um
microframework?
http://www.flickr.com/photos/payayita/3313899667/




Simplicidade
mas o



é

    simples.
django helloworld

3 comandos
2 linhas de configuração
3 linhas de código
Bônus



http://www.flickr.com/photos/malingering/58838080/
Flexibilidade




                http://www.flickr.com/photos/wainwright/351684037/
from flask import Flask

app = Flask('hello')

@app.route('/hello')
def hello():
    return 'Hello world'

app.run()
Simples,
    leve e
 pequeno.
http://www.flickr.com/photos/st3f4n/4406339573/




Não subestime
os pequenos
Flask não é full
     stack
Acoplamento




              http://www.flickr.com/photos/inertiacreeps/1414772429/
Deixe um framework de persistência
cuidar do seu banco de dados...
Deixe um framework de persistência
cuidar do seu banco de dados...




  seja lá qual for seu banco de dados.
Deixe um framework de persistência
cuidar do seu banco de dados...




  seja lá qual for seu banco de dados.
Extensível
Extensões para...
       Formulários
       Bancos de dados
       Testes
       i18n
       Caching
       CSRF
       Te...
http://www.flickr.com/photos/ntrlwmn/4103357982/




                                                   Bônus!
Um CRUD cairia
                          bem...


$   pip install Flask Flask-WTF Flask-SQLAlchemy
$   mkdir projetos
$   ...
Um CRUD cairia
                          bem...


$   pip install Flask Flask-WTF Flask-SQLAlchemy
$   mkdir projetos
$   ...
Criação da
            aplicação
from flask import Flask

app = Flask(__name__)
Banco de dados, com
                                 SQLAlchemy



from flaskext.sqlalchemy import SQLAlchemy

app.config[...
Formulários, com
                             WTForms

from flaskext import wtf

app.config['SECRET_KEY'] = 'HSAOIHs8ashw8...
http://www.flickr.com/photos/cayusa/981372736/




                                                 Formulários
          ...
View para exibição
                       do formulário



from flask import render_template

@app.route('/novo_projeto')
...
Template, com
                                  Jinja2
<html>
    <head>
        <meta http-equiv="Content-type" content="...
Template, com
                                  Jinja2
<html>
    <head>
        <meta http-equiv="Content-type" content="...
Don't repeat
 yourself!
  ●   Jinja2 macros
Macro para renderizar
                    campo do formulário

{% macro render_field(field) %}
    <p><label
for="{{ field...
Template, com
                                  Jinja2
<html>
    <head>
        <meta http-equiv="Content-type" content="...
Template, com
                            Jinja2 Macro
<html>
    <head>
        <meta http-equiv="Content-type" content="...
Estendendo a view para
                            receber dados do
                                  formulário




from ...
Estendendo a view para
                            receber dados do
                                  formulário




from ...
RESTful URL
               routing
Utilíssimo para criação de APIs =)
RESTful URL
               routing
Utilíssimo para criação de APIs =)


     Problemático para trabalhar com
             ...
HTML 5?
Estendendo a view para
                            receber dados do
                                  formulário
from flas...
View para listagem
                        dos projetos



@app.route('/projetos')
def listar_projetos():
    projetos = P...
Template para
                           listagem
<html>
    <head>
        <meta http-equiv="Content-type" content="text/...
Template para
                           listagem
<html>
    <head>
        <meta http-equiv="Content-type" content="text/...
Don't repeat
 yourself!
  ● Jinja2 macros
  ● Herança de templates
Template base
                          para herança

<html>
    <head>
        <meta http-equiv="Content-type" content="t...
Template de formulário
                              refatorado

{% extends "base.html" %}
{% block titulo %}
    Cadastro...
Template de listagem
                                 refatorado

{% extends "base.html" %}
{% block titulo %}
    Listage...
Executando a
            aplicação


$ python projetos.py
http://www.flickr.com/photos/smart-trips/4047872730/




                                                       E agora?
http://www.flickr.com/photos/smart-trips/4047872730/




                        flask.pocoo.org




                     ...
http://www.flickr.com/photos/smart-trips/4047872730/




                        flask.pocoo.org

                 werkzeu...
http://www.flickr.com/photos/smart-trips/4047872730/




                        flask.pocoo.org

                 werkzeu...
Francisco Souza
          @franciscosouza
www.franciscosouza.com.br
Flask: Microframework para construção de aplicações web em Python
Flask: Microframework para construção de aplicações web em Python
Flask: Microframework para construção de aplicações web em Python
Upcoming SlideShare
Loading in...5
×

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

3,691

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
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,691
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
94
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Transcript of "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
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×