Schrödinger's Flask: ¿vive la serpiente?

Rafael Medina García

Antes de empezar

  • You can put fairies in a bottle, but Pythons go in Flasks
  • Hay una serpiente en mi frasco
  • Flask py.ece
  • Kore wa Python desu ka
  • Snake inside the Flask: Homunculus
  • I've got a big Flask of snakes here

Python 101

Tipos

# Asignación
a = 1
a = 'ardilla'
a = {'ardilla': 1}

# Listas
b = [1, 2, 3, 4, 'patata', 34, 2, [1, 'una string'], (0, False)]

Condicionales

a = False

if a: # if a == True
    print(True)

if not a: # if a == False
    print(False)

Funciones

def mifuncion(param1, param2):
    # Imprime los parámetros
    print(param1)
    print(param2)

Clases

class Miclase:

    def __init__(self, param1):
        self.atributo = param1


clase = Miclase('patata')
print(clase.atributo)
>>> 'patata'

clase.atributo = 'queso'
print(clase.atributo)
>>> 'queso'

Módulos: Estructura

run.py
mipaquete/
    __init__.py
    mod1.py
    mod2.py

Módulos: Import

#run.py

# Método 1
import mipaquete

mipaquete.mod1.funcion1()

# Método 2
from mipaquete import mod1

mod1.funcion1()

# Método 3
from mipaquete.mod1 import *

funcion1()

MVC 101

Modelo

  • Representación de la información (datos)
  • En Flask: models.py

Vista

  • Presentación de la información (estilo)
  • En Flask: templates/*.html

Controlador

  • Gestor de eventos e interacción con modelos
  • En Flask: views.py

Herramientas

Base

Virtualenv

https://virtualenv.readthedocs.org/en/latest/

$ virtualenv -p python3 env

$ . env/bin/activate

pip

http://pip.readthedocs.org/en/stable/installing/

Suele venir de serie en la mayoría de distribuciones:

# apt-get install python3-pip

Flask vs Django

¿Qué debería usar?

Flask vs otras cosas

¿Qué debería usar?

Flask vs Java EE

¿Qué debería... ?

Java es caca

Descargas

Usando git:

$ git clone https://github.com/rmed/schrodingers_flask.git

O visitando https://github.com/rmed/schrodingers_flask y descargando el zip

¡Al código!

Estructura de un proyecto "grande"

Explore Flask

run.py              -> para lanzar la aplicación
config/             -> configuraciones locales
    development.py
instance/           -> configuraciones "reales" (IGNORAR EN GIT)
    production.cfg
app/
    __init__.py     -> inicialización
    models.py       -> modelos
    views/          -> vistas (controladores)
        __init__.py
        profile.py
    templates/      -> plantillas
        profile/
        layout.html
    static/         -> archivos estáticos
        css/
        img/
        js/

Ejemplo de proyecto: Nyanter

Extra: despliegue de aplicaciones

Herramientas

uWSGI

/etc/uwsgi/apps-available/nyanter.ini

[uwsgi]
vhost = true
socket = /tmp/nyanter.sock
venv = /var/www/nyanter/env
chdir = /var/www/nyanter/app
module = run
callable = app

nginx

/etc/nginx/sites-available/nyanter

server {
        listen 80;

        server_name nyanter.rmedgar.com;

        location / { try_files $uri @nyanter; }
        location @nyanter {
            include uwsgi_params;
            uwsgi_pass unix:/tmp/nyanter.sock;
        }
}

Algunos enlaces

MIAU
MIAU