27. IDEA
✓ SIMPLE
✓ CON UN FIN ESPECÍFICO
✓ SENTIDO
lunes, 28 de enero de 13
28. EJECUCIÓN
✓ SENCILLA
✓ MEJORAS EN ITERACIONES
✓ NO PRE - OPTIMIZAR
lunes, 28 de enero de 13
29. Minimun
Viable
Product
lunes, 28 de enero de 13
30. No
Complicarse
La
Vida
lunes, 28 de enero de 13
31. PROYECTO 1
✓ JUGAR CON BOTTLEPY
✓ DEPLOY EN VPS
lunes, 28 de enero de 13
32. REQUISITOS I
✓ BOTTLEPY
✓ NGINX
✓ GUNICORN
✓ SUPERVISOR
lunes, 28 de enero de 13
33. REQUISITOS II
✓ VPS
✓ DIGITAL OCEAN
✓ PROMO CODE: SSDBEAR20
✓ 20 $ ~ 3 MESES
lunes, 28 de enero de 13
34. BOTTLEPY
✓ UN ARCHIVO
✓ LIBRERÍA ESTÁNDAR PYTHON
✓ ROUTING, TEMPLATES,
FORMULARIOS, COOKIES…
✓ COMPATIBLE HTTP WSGI
lunes, 28 de enero de 13
35. BOTTLEPY
CUIDADO CON:
➡ PROYECTOS GRANDES
➡ ORM
➡ LAYOUT PROYECTO
lunes, 28 de enero de 13
36. EJEMPLO
import bottle
app = bottle.default_app()
@app.route('/', method='GET')
@app.route('/greet/<name:re:[a-z]+>', method='GET')
def greet(name='world'):
res = {}
res['status'] = 'OK'
res['result'] = 'Hello %s' % name
return res
if __name__ == '__main__':
bottle.run(app, host='localhost', port=5000, debug=True,
reloader=True)
lunes, 28 de enero de 13
37. EJEMPLO
➡ PETICIÓN
http://127.0.0.1:5000/greet/antonio
➡ RESULTADO
{
"status": "OK",
"result": "Hello antonio"
}
lunes, 28 de enero de 13
38. FIBONACCI I
class Fibonacci(object):
def __init__(self, steps):
self.a = 0
self.b = 1
self.index = 0
self.steps = steps
def calculate(self):
if self.steps > 0:
if self.steps == 1:
yield self.a
else:
yield self.a
yield self.b
self.index = self.index + 2
while self.index < self.steps:
self.a, self.b = self.b, self.a + self.b
self.index = self.index + 1
yield self.b
else:
raise Exception(''steps' must be an integer >= 0')
lunes, 28 de enero de 13
39. FIBONACCI II
@app.route('/fibonacci', method='POST')
def fibonacci():
res = {}
steps = bottle.request.forms.steps
try:
steps = int(steps)
fib = Fibonacci(steps)
seq = fib.calculate()
res['status'] = 'OK'
res['result']={}
res['result']['sequence'] = [n for n in seq]
except Exception as e:
res['status'] = 'Error'
res['message'] = '%s' % e
return res
lunes, 28 de enero de 13
40. EJEMPLO
➡ PETICIÓN
POST http://127.0.0.1:5000/fibonacci
steps = 5
➡ RESULTADO
{
"status": "OK",
"result": {
"sequence": [0, 1, 1, 2, 3]
}
}
lunes, 28 de enero de 13
41. NGINX
sudo nano /etc/nginx/sites-available/project1
upstream app_server {
server 127.0.0.1:8001 fail_timeout=0;
}
server {
server_name 127.0.0.1;
listen 127.0.0.1:80;
root /home/username/projects/project1;
location / {
try_files $uri @proxy_to_app;
}
location @proxy_to_app{
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server;
}
}
lunes, 28 de enero de 13
42. SUPERVISOR
sudo nano /etc/supervisor/conf.d/project1.conf
[program:project1]
command= /home/username/projects/project1/venv/bin/gunicorn -c /
home/username/projects/project1/gunicorn.prod.conf project1:app
directory=/home/username/projects/project1
autostart=true
autorestart=true
redirect_stderr=true
lunes, 28 de enero de 13
43. LOCALHOST
1. GIT CLONE HTTPS://GITHUB.COM/AHMONTERO/SIDE-PROJECTS-SPEECH.GIT
2. CD SIDE-PROJECTS-SPEECH
3. CHMOD +X SETUP_ENV.SH
4. ./SETUP_ENV.SH
5. SOURCE __VEN__/BIN/ACTIVATE
6. PIP INSTALL -R REQUIREMENTS.TXT
7. PYTHON PROJECT1.PY
8. HTTP://127.0.0.1:5000/GREET/ANTONIO
lunes, 28 de enero de 13
44. PROYECTO 1I
✓ WEB SCRAPING
✓ API HTTP REST
✓ DJANGO + TWITTER
✓ BOOTSTRAP
lunes, 28 de enero de 13
45. BRAINSTORMING
✓ OFERTAS DE TRABAJO
✓ EMPRESAS JÓVENES E
INNOVADORAS
✓ RISAS
lunes, 28 de enero de 13
46. ESPECIFICACIONES
✓ PARSEAR OFERTAS
✓ CLASIFICARLAS
✓ LOGIN CON TWITTER
✓ COMENTARIOS
lunes, 28 de enero de 13
47. REQUISITOS
✓ BEAUTIFUL SOUP
✓ DJANGO
✓ NGINX
✓ GUNICORN
✓ SUPERVISOR
lunes, 28 de enero de 13
48. DATA SCRAPING
✓ BEAUTIFUL SOUP
✓ SCRIPT INDEPENDIENTE
✓ USA API HTTP
lunes, 28 de enero de 13
49. API HTTP REST I
✓ DJANGO-TASTYPIE
✓ DOCUMENTACIÓN
✓ AUTENTICACIÓN
✓ EXTENSIBLE (NOSQL…)
lunes, 28 de enero de 13
50. API HTTP REST II
✓ AUTENTICACIÓN
✓ API_USER
✓ API_KEY
✓ SIN COMPLICACIONES
lunes, 28 de enero de 13