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. 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.
  2. 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.
  3. "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
  4. Donde puedo usarlo? • WebHook: Callbacks • APIs • Restful

    en general • Websites complejos con contenido dinámico
  5. 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.
  6. Hello World! from flask import Flask app = Flask(__name__) @app.route('/')

    def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run()
  7. 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__':
  8. Plantillas from flask import Flask from flask import render_template @app.route('/hello/')

    @app.route('/hello/<name>') def hello(name=None): return render_template('hello.html', name=name) /app.py /templates /hello.html
  9. 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 ''' <form method="post"> <p><input type=text name=username> <p><input type=submit value=Login> </form>''' @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'
  10. 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.
  11. 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)
  12. 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.
  13. 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, '/<string:todo_id>') if __name__ == '__main__': app.run(debug=True)
  14. 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'}
  15. 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')
  16. 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.
  17. 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)
  18. 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")
  19. Plantillas {% extends "layout.html" %} {% block content %} <h2>Contact</h2>

    {% if success %} <p>Thank you for your message. We'll get back to you shortly.</p> {% else %} {% for message in form.name.errors %} <div class="flash">{{ message }}</div> {% endfor %} {% for message in form.email.errors %} <div class="flash">{{ message }}</div> {% endfor %} {% for message in form.subject.errors %} <div class="flash">{{ message }}</div> {% endfor %} {% for message in form.message.errors %} <div class="flash">{{ message }}</div> {% endfor %} <form action="{{ url_for('contact') }}" method=post> {{ form.name.label }} {{ form.name }} {{ form.email.label }} {{ form.email }} {{ form.subject.label }} {{ form.subject }} {{ form.message.label }} {{ form.message }} {{ form.submit }} </form> {% endif %} {% endblock %}
  20. 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.
  21. 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