Damián * Pumar

Matias * Barriento

* = Alberto

Disclaimer

  • No somos expertos en estos frameworks
  • Tal vez no sepamos responder alguna pregunta
  • Eso no significa que no haya que hacerlas

Matías Barriento

  • Desarrollador Python, JS
  • También hago cosas feas en otros lenguajes  <cof>C#</cof>
  • Miembro de Python Argentina
  • Nerd para los Hippies, Hippie para los Nerds

Damián Pumar

  • Desarrollador?Na,me falta mucho
  • Solo hago varias cosas en algunos lenguajes
  • Miembro de ninguna comunidad
  • Nerd para cualquiera que me escuche hablar! :P

Parte 1 - Veleros

Sails es un popular framework web MVC para Node.js

 

Sistema Operativo

Lenguaje

JavaScript, NodeJS, MVC

Cross-platform

Bases de Datos

  • MySQL
  • PostgreSQL
  • Oracle

Otros

  • MongoDB
  • Sqlite/Flat File
  • Redis

Autogeneración de API

Hello World

Instalación

$ sudo npm install sails -g
module.exports = {
    helloWorld: function(req, res) {
	return res.ok(
	{
	    action: 'Hello',
	    from: 'World'
	}, 
        'viewName'// viewName.ejs
     );
    }
};
$ sails lift
sails new myProject

Estructura

Sails js tiene predefinida una estructura

 

app
├── api
│   ├── controllers
│   ├── hooks
│   ├── models
│   ├── policies
│   ├── responses
│   └── services
│
├── assets
│   ├── images
│   ├── js
│   ├── styles
│   └── templates
│    
├── config
│    └── ...
└── views
    └── ...

Routes

En Sails la rutas se definen en un archivo llamado 'routes.js' ubicado dentro de la carpeta config

//HelloController.js
module.exports = {
    //'GET /' : 'HelloController.hello',
    	hello: function(req, res) {
    		var params = req.params.all()
    
    		if (params.name)
    			return res.ok('Hello ' + params.name + '!');
    
    		return res.ok('Hello, World!');
    	},
    //'/login' : 'HelloController.login'
    	login: function(req, res) {
    		if (req.method.toUpperCase() == 'POST') {
    			return res.ok('do_the_login');
    		} else if (req.method.toUpperCase() == 'GET') {
    			return res.ok('show_the_login_form');
    		}
    		return res.notFound();
    	}
};

Templates con EJS

EJS está basado en js, van a notar que la sintaxis es similar a javascript, pero cada salto de línea se incorpora el <% { js code} %>

<ul>
   <% pages.forEach(function(page) { %>
       <li><%= page.link %></li>
   <% }); %>
</ul>
<div>
   <% if(audience.enjoy_talk()){ %>
    APLAUSOS
   <% } else { %>  
    A LA GRANDE LE PUSE CUCA!
   <% } %>
</div>
<ul>
  <li>
    <a href="www.itfloss.rocks">
        ITFLOSS
    </a>
  </li>
  <li>
    <a href="www.sailsjs.com">
        SAILS JS
    </a>
  </li>
</ul>
<div>
    APLAUSOS
</div>

Templates con EJS

<% if(imgs.length > 0){ %>
 <% imgs.forEach(function(img) { %>
    <img src="
uploads/<%=user.username%>/<%= img %>">
 <% }); %>
<% } else{ %>  
    <p>no photos uploaded</p>
<% } %>
<body>
<ul>
    <% for(var i=0; i<supplies.length; i++) {%>
       <li><%= supplies[i] %></li>
    <% } %>
    </ul>
</body>
<%- include partial_layout.ejs %>
<%= title %>
<% if (user) { %>
  <h2><%= user.name %></h2>
<% } %>
<%= img_tag('maid.jpg') %>
<%= link_to(supplies[i], 
    supplies/'+supplies[i]) %>
     between the <li> tags

Trabajando con JSONs

module.exports = {
    anyVerb: function(req, res) {
	return res.json({
	    fullName: 'LISA JUNIOR'
	});
    }
};
module.exports = {
    otherVerb: function(req, res) {
	var users= [{
			name: 'Damián',
			id: 1
		}, {
			name: 'Matías',
			id: 2
		}];
	return res.view('home/index', { users : users, title: "Hello" });
    }
};

DB

Sails permite trabajar con múltiples DB

///config/connection.js
 MongodbServer: {
    adapter: 'sails-mongo', //Nombre del adapter
    host: 'localhost',
    port: 27017,
    // user: 'username', //optional
    // password: 'password', //optional
    database: 'ExampleDB' //optional
  },
 //config/models.js
 connection: 'MongodbServer', 
    //mismo nombre definido en connection.js
 migrate: 'safe'

DB

Sails trabaja con un propio ORM llamado Waterline

Algunas funciones disponibles

  • Create
  • find
  • findOne
  • update
  • destroy
  • findOrCreate
  • count
  • native
  • query
  • stream
Persona.create({
	name: persona.name,
	lastName: persona.lastName
}).exec(function createCB(err, nuevaPersona) {
	return res.ok(nuevaPersona);
});

sails.models.kitten.find().then(function(alltheKittens) {
  //.... 
}).catch(function(err){
  //....
});

Debugging

Live mode!

if(doYouHaveAnyQuestion){
   console.log("Time is now");
}
else {
   console.log("Ouch");
}

Parte 2 - Frascos

Flask es un microframework liviano para aplicaciones web en Python

 

Sistema Operativo

Lenguaje

Python 2 y Python 3

Cross-platform

Bases de Datos

  • MySQL/MariaDB
  • PostgreSQL/SqlServer
  • Oracle

Usa como componentes a Werkzeug y Jinja2

  • MongoDB
  • Sqlite/Flat File
  • Redis

Hello World

# hello.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

Instalación

(myenv) $ pip install Flask
(myenv) $ export FLASK_APP=hello.py
(myenv) $ # export FLASK_DEBUG=1
(myenv) $ flask run

Estructura

Flask nos da la libertad de diseñar la estructura de nuestra aplicación, con pocas convenciones, e ir modificandola a medida que crece,

app
├── app.py # aplicación 
├── static # convención
│   └── index.js
├── templates # convención
│   ├── index.html
├── models.py # archivo de modelos
└── utils.py
app
├── __init__.py
├── manage.py # archivo de comandos
└── app
    ├── __init__.py # apliación
    ├── app.py # blueprint
    ├── api.py # blueprint
    ├── utils.py
    ├── auth.py # blueprint
    ├── models # modulo de modelos
    │   ├── __init__.py
    │   ├── user.py
    │   └── places.py
    ├── static # convención
    │   ├── css
    │   └── js
    └── templates # convención
        ├── index.html
        └── _layout.html

Estructura - Blueprints

Blueprints nos permite dividir en módulos independientes nuestra aplicación y conseguir una mejor organización

# hello.py
from flask import Flask
from world import say_hello

app = Flask(__name__)
app.register_blueprint(say_hello)
# world.py
from flask import Blueprint

say_hello = Blueprint('say_hello', __name__,
                      template_folder='templates')

@say_hello.route('/')
def hello_world():
    return 'Hello, World!'

Routes

En Flask usamos decoradores para definir los endpoints y sus métodos

# hello.py
from flask import Flask, request
app = Flask(__name__)

@app.route('/')
@app.route('/<name>')
def hello(name=None):
    if name:
        return 'Hello, {0}!'.format(name)
    return 'Hello, World!'


@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return do_the_login()
    else:
        return show_the_login_form()

Templates con Jinja2

Jinja2 es un potente lenguaje de templates

<ul>
{% for page in pages %}
  <li>
    <a href="{{ page.url }}">
        {{ page.username }}
    </a>
  </li>
{% endfor %}
</ul>
<div>
{% if audience.enjoy_talk() %}
    APLAUSOS
{% else %}
    CALLESE HOMBRE HORRIBLE!
{% endif %}
</div>
<ul>
  <li>
    <a href="www.itfloss.rocks">
        ITFLOSS
    </a>
  </li>
  <li>
    <a href="www.python.org.ar">
        PYAR
    </a>
  </li>
</ul>
<div>
    CALLESE HOMBRE HORRIBLE!
</div>

Templates con Jinja2

<h1>Members</h1>
<ul>
{% for user in users %}
  <li>{{ user.username|e }}</li>
{% endfor %}
</ul>
<div>
    {% if True %}
        yay
    {% endif %}
</div>
{# base.html #}
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
    <div id="content">
        {% block content %}
        {% endblock %}
    </div>
</body>
</html>
{# index.html #}
{% extends "base.html" %}
{% block content %}
    <h1>Index</h1>
    <p class="important">
      Flask vs Sails
    </p>
{% endblock %}
{# renders.html #}
{% macro render_page(page) -%}
    <li> 
        <a href="{{ page.url }}"> {{ page.username }} </a>
    </li>
{%- endmacro %}
{% import 'renders.html' as renders %}
<ul>
{% for page in pages %}
    {{renders.render_page(page)}}
{% endfor %}
</ul>

Templates con Jinja2

# app.py
from flask import Flask, render_template
from .model import get_users

app = Flask(__name__)


@app.route('/')
def index():
    users = get_users()
    return render_template('index.html', users=users)

Trabajando con JSONs

# app.py
import json
from flask import Flask
from .model import get_users

app = Flask(__name__)


@app.route('/')
def index():
    users = [{
                "name": 'Damián',
                "id": 1
            },
            {
                "name": 'Matías',
                "id": 2
            }
    ];

    return json.dumps(users)

DB

Flask no integra ningún modulo de base de datos por defecto. 

Extensiones para DB

  • Flask-MongoEngine
  • Flask-PyMongo
  • Flask-MongoAlchemy
  • Flask-MongoKit
  • Flask-SQLAlchemy
  • Flask-Redis
  • Flask-And-Redis
  • Cualquier libreria Python

Plugins

  • Flask-Admin
  • Flask-Login
  • Flask-RESTful
  • Flask-Script
  • Flask-WTF

Flask se apoya mucho en sus extensiones y se integra bien con las librerias de Python

Debugging

Live mode!

Había que poner un meme

try:
    me.responder(audiencia.preguntas)
except AttributeError:
    print("Audiencia no tiene preguntas")

GRACIAS

Repo

Sails js vs Flask

By Damian Pumar