Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Abramos el Frasco!

Abramos el Frasco!

Empezando con lo básico de Flask

Valery Briz

July 29, 2017
Tweet

More Decks by Valery Briz

Other Decks in Programming

Transcript

  1. View Slide

  2. Qué es Flask?
    Flask es un micro web framework desarrollado en Python y
    basado en el toolkit de Werkzeug y en el motor de plantillas
    Jinja2.
    Flask es bastante popular en la comunidad
    actualmente con 28,538 stars en Github.

    View Slide

  3. Y qué es un micro web framework?
    “Micro” no significa que toda tu aplicación tiene que caber
    en un solo archivo Python (aunque si es posible), tampoco
    significa que a Flask le falta funcionalidad. El “micro” en
    microframework significa que Flask matiene un core simple
    pero que puede ser extendido.
    Flask no toma muchas decisiones por ti, como por ejemplo
    que base de datos utilizar. Y las decisiones que si toma son
    faciles de cambiar, por ejemplo que motor de plantillas va a
    utilizar. Todo lo demás depende de ti.
    Asi, Flask puede ser todo lo que necesitas y nada que no
    necesites.

    View Slide

  4. "La idea de Flask es construir una buena base
    para todas tipo de aplicaciones. El resto
    depende de ti o de extensiones."
    Armin Ronacher, creador de Flask

    View Slide

  5. Django Vs Flask
    No hay un versus porque tienen propositos
    distintos.

    View Slide

  6. Donde puedo usarlo?
    • WebHook: Callbacks
    • APIs
    • Restful en general
    • Websites complejos con contenido dinámico

    View Slide

  7. Quienes utilizan Flask actualmente?
    • Pinterest:
    – "En el presente la API de Pinterest procesa al rededor de 12
    billones de requests por día, todo en Flask." Steve Cohen.
    • Linkedin:
    – "Toda nuestra infraestructura interna esta desarrollada en
    Python: deployment, monitoreo, performance, y todos los sitios
    internos son Python. Y eso sin incluir el procesamiento y
    analisis de Big Data." Rachel Sanders, Pycon 2014.
    • Twilio, wakatime, close.io, Indico.

    View Slide

  8. Hello World!
    from flask import Flask
    app = Flask(__name__)
    @app.route('/')
    def hello_world():
    return 'Hello World!'
    if __name__ == '__main__':
    app.run()

    View Slide

  9. Instalación
    $ pip install Flask
    $ python app.py

    View Slide

  10. POST y GET
    from flask import Flask
    app = Flask(__name__)
    @app.route('/', methods=['GET',
    'POST'])
    def hello_world():
    if request.method == 'POST':
    return 'Esto es un POST'
    elif request.method == 'GET':
    return 'Esto es un GET'
    if __name__ == '__main__':

    View Slide

  11. Plantillas
    from flask import Flask
    from flask import render_template
    @app.route('/hello/')
    @app.route('/hello/')
    def hello(name=None):
    return render_template('hello.html', name=name)
    /app.py
    /templates
    /hello.html

    View Slide

  12. Sesiones
    from flask import Flask, session, redirect,
    url_for, escape, request
    app = Flask(__name__)
    @app.route('/')
    def index():
    if 'username' in session:
    return 'Logeado como %s' %
    escape(session['username'])
    return 'No estas logueado'
    @app.route('/login', methods=['GET', 'POST'])
    def login():
    if request.method == 'POST':
    session['username'] =
    request.form['username']
    return redirect(url_for('index'))
    return '''
    name=username>

    '''
    @app.route('/logout')
    def logout():
    session.pop('username', None)
    return redirect(url_for('index'))
    #llave para mantener segura la sesion
    app.secret_key = 'A0Zr98j/3~RT'

    View Slide

  13. Flask-RESTful es una extensión de Flask
    que agrega soporte para desarrollar
    rapidamente REST APIs. Funciona con
    una abstracción que la hace minimalista
    y funciona con librerias/ORMs existentes.

    View Slide

  14. Simple
    from flask import Flask
    from flask_restful import Resource, Api
    app = Flask(__name__)
    api = Api(app)
    class HelloWorld(Resource):
    def get(self):
    return {'hello': 'world'}
    api.add_resource(HelloWorld, '/')
    if __name__ == '__main__':
    app.run(debug=True)

    View Slide

  15. Instalación Flask Restful
    $ pip install flask-restful
    $ python api.py

    View Slide

  16. Ruteo con Recursos
    La principal ventaja de Flask-RESTful son los recursos.
    Los Recursos son construidos encima de las vistas de
    Flask, dando un facil acceso a multiples metodos HTTP
    al definir estos metodos en los recursos. Un recurso de
    CRUD básico se vería como el siguiente.

    View Slide

  17. CRUD Básico
    from flask import Flask, request
    from flask_restful import Resource, Api
    app = Flask(__name__)
    api = Api(app)
    todos = {}
    class TodoSimple(Resource):
    def get(self, todo_id):
    return {todo_id: todos[todo_id]}
    def put(self, todo_id):
    todos[todo_id] = request.form['data']
    return {todo_id: todos[todo_id]}
    api.add_resource(TodoSimple, '/')
    if __name__ == '__main__':
    app.run(debug=True)

    View Slide

  18. Multiples metodos de Respuesta
    class Todo1(Resource):
    def get(self):
    # Default 200 OK
    return {'task': 'Hello world'}
    class Todo2(Resource):
    def get(self):
    # Establecer la respuesta a codigo 201
    return {'task': 'Hello world'}, 201
    class Todo3(Resource):
    def get(self):
    # Establecer el codigo a 201 y retornar cabeceras customizadas
    return {'task': 'Hello world'}, 201, {'Etag': 'some-opaque-string'}

    View Slide

  19. Formato de los Datos
    from collections import OrderedDict
    from flask_restful import fields, marshal_with
    resource_fields = {
    'task': fields.String,
    'uri': fields.Url('todo_ep')
    }
    class TodoDao(object):
    def __init__(self, todo_id, task):
    self.todo_id = todo_id
    self.task = task
    # Este campo no se enviara en la respuesta
    self.status = 'active'
    class Todo(Resource):
    @marshal_with(resource_fields)
    def get(self, **kwargs):
    return TodoDao(todo_id='my_todo', task='Remember the milk')

    View Slide

  20. Con WTForms, los campos de la form en HTML pueden
    ser generados automaticamente pero también se pueden
    modificar en base a las plantillas preestablecidas. Esto
    permite la separación entre el codigo que sirve para el
    procesamiento y el que sirve para la presentación dando
    como resultad un codigo más claro y efectivo.

    View Slide

  21. Instalación Flask WTF
    $ pip install Flask-WTF
    $ python route.py

    View Slide

  22. Rutas
    from flask import Flask, render_template, flash, request, jsonify
    from forms import *
    import json
    app = Flask(__name__)
    app.secret_key = 'ILove3.1416thon'
    @app.route('/')
    def home():
    return render_template('home.html')
    @app.route('/contact', methods=['GET', 'POST'])
    def contact():
    form = ContactForm(request.form)
    if request.method == 'POST':
    if form.validate() == False:
    flash('All fields are required.')
    return render_template('contact.html', form=form)
    #return 'Error'
    else:
    return render_template('contact.html', success=True)
    #return 'Form posted.'
    elif request.method == 'GET':
    return render_template('contact.html', form=form)

    View Slide

  23. Forms
    from wtforms import Form, TextField, TextAreaField, SubmitField, validators, ValidationError
    class ContactForm(Form):
    name = TextField("Name", [validators.Required("Please enter your name.")])
    email = TextField("Email", [validators.Required("Please enter your email address."),
    validators.Email("Please enter your email address.")])
    subject = TextField("Subject", [validators.Required("Please enter a subject.")])
    message = TextAreaField("Message", [validators.Required("Please enter a message.")])
    submit = SubmitField("Send")

    View Slide

  24. Plantillas
    {% extends "layout.html" %}
    {% block content %}
    Contact
    {% if success %}
    Thank you for your message. We'll get back to you
    shortly.
    {% else %}
    {% for message in form.name.errors %}
    {{ message }}
    {% endfor %}
    {% for message in form.email.errors %}
    {{ message }}
    {% endfor %}
    {% for message in form.subject.errors %}
    {{ message }}
    {% endfor %}
    {% for message in form.message.errors %}
    {{ message }}
    {% endfor %}

    {{ form.name.label }}
    {{ form.name }}
    {{ form.email.label }}
    {{ form.email }}
    {{ form.subject.label }}
    {{ form.subject }}
    {{ form.message.label }}
    {{ form.message }}
    {{ form.submit }}

    {% endif %}
    {% endblock %}

    View Slide

  25. Necesito Apache o algún otro Web Server
    para correr Flask?
    Inicialmente no, ya que Flask incluye un Built-in
    Development Server, sin embargo lo ideal es que para
    producción se utilice un Web Server como Nginx,
    Waitress o Apache.

    View Slide

  26. Donde puedo encontrar información de Flask?
    • http://flask.pocoo.org/
    • http://flask.pocoo.org/docs/0.12/
    • https://flaskbook.com
    • http://slides.com/vero4ka/flask-con-todas-las-arandelas
    • http://flask-restful.readthedocs.io
    • https://wtforms.readthedocs.io

    View Slide

  27. Sobre mí
    @valerybriz
    guatebot.com/blog

    View Slide