15 de agosto de 2014
python, python3, scapping
Comentarios

Url scraper en python3

Para el pegue me toco obtener la lista de todas las URLs en un sitio. Luego de pensarla por un rato se me ocurrió hacerlo utilizando mi lenguaje de programación favorito.

Este código se puede limpiar bastante, definitivamente no es una guia de como escribir buen código, en mi opinión hay muchas variables globales. Pero funciona y no tomo mas de una hora en escribir. Ademas de eso estoy usando Python3! y Futures

13 de agosto de 2014
decorator, python
Comentarios

Retry Decorator

Recientemente tuve un problema con un webapi, resulta que estaba llegando a los limites de uso del API y muchas peticiones estaban fallando. Buscando una manera sencilla de reintentar las tareas se me ocurrio crear un decorador y aca esta el resultado.

La idea es usarlo de la siguiente manera

@retry(errors.HttpError)
def execute_request(request):
    return request.execute()

El decorador va a capturar las excepciones que reciba como parametro y reintentar la función cada cierto tiempo hasta llegar a un maximo. Probablemente hay mucho que mejorar, quizas definir la cantidad de intentos con un parametro, debería de usar functools.wraps o incluso otras cosas.

Pero bueno eso queda de ejercicio al lector

16 de julio de 2014
asyncio, python
Comentarios

Generador de codigos QR con asyncio

Ultimamente he estado interesado en aprender asynncio y luego de ver un peguesito en odesk donde pedían crear un generador de codigos QR me dije que seria interesante hacer un servidor de codigos QR.

Aca mi implementación:

Para correrlo solamente es necesario instalar las librerias en el requirements.txt y luego

$ python3 qrio.py

Asumiendo que tengamos el programa httpie instalado lo podemos probar de esta forma

$ http http://127.0.0.1:8000/  data=test  -d
HTTP/1.1 200 OK
CONNECTION: keep-alive
CONTENT-DISPOSITION: inline; filename="qr.png"
CONTENT-TYPE: img/png
DATE: Wed, 16 Jul 2014 22:36:28 GMT
SERVER: Python/3.4 aiohttp/0.8.2
TRANSFER-ENCODING: chunked

Downloading to "qr.png"
Done. 446.00 B in 0.01467s (29.70 kB/s)

Y el resultado es: test

12 de junio de 2012
django, python, webfaction
Comentarios

Configurando django, gunicorn y supervisord en webfaction

En este mi primer blog hablaré de como configurar django usando gunicorn y supervisord en webfaction. Antes que nada quiero decir que webfaction es de los mejores hosting que he probado, sin embargo, ultimamente he estado probando gunicorn y debo decir que lo siento mucho más comodo que apache.

En este tutorial asumo que tenemos una cuenta de webfaction nueva y con el home limpio. Además usaremos el siguiente proyecto de Django como ejemplo https://bitbucket.org/armonge/webfactiontut.

Paso 1: Instalar pip y virtualenv

mkdir -p ~/lib/python2.7
easy_install-2.7 pip
pip install virtualenv

Paso 2: Instalar Django

Para instalar nuestra aplicación Django vamos al panel de administración de webfaction y creamos 3 aplicaciones nuevas

  • webfactiontut: Esta es una aplicación del tipo "Custom app(listening on port)" y sera donde instalemos nuestra aplicación Django
  • webfactiontut_static: Esta aplicación es del tipo "Static only(no .htaccess)" y servira para nuestros archivos estáticos
  • webfactiontut_media: Esta es del tipo "Static only(no .htaccess)" y servira para nuestros archivos de media

También es necesario crear una base de datos para el proyecto

Teniendo todo lo anterior nos dirigimos a /home/user/webapps/webfactiontut y ejecutamos

cd /home/user/webapps/webfactiontut
git clone https://bitbucket.org/armonge/webfactiontut.git webfactiontut
virtualenv --distribute --system-site-packages env
source env/bin/activate
pip install -r webfactiontut/requirements.txt

Con esto listo tenemos que cambiar lo siguiente en nuestra configuración de Django

STATIC_ROOT = '/home/user/webapps/webfactiontut_static'
MEDIA_ROOT = '/home/user/webapps/webfactiontut_media'
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'user_webfactiontut',                      # Or path to database file if using sqlite3.
        'USER': 'user_webfactiontut',                      # Not used with sqlite3.
        'PASSWORD': 'SOME VERY DIFFICULT PASSWORD',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

Y por último teniendo ya configurado el proyecto

python manage.py syncdb
python manage.py collectstatic

Paso 3: Configurando supervisor

Supervisord es un proceso que prefiero instalar a nivel global y no en el virtualenv, esto por que normalmente sólo tendremos un proceso de supervisor para muchas aplicaciones, dicho esto:

deactivate
cd 
pip install supervisor
cp lib/python2.7/supervisor/skel/sample.conf supervisord.conf

Con lo anterior tenemos supervisord instalado y un archivo de configuración que sólo falta personalizar, lo primero es cambiar todas las rutas para que apunten a direcciones dentro de nuestro home.

[unix_http_server]
file=/home/user/supervisor.sock   ; (the path to the socket file)

[supervisord]
logfile=/home/user/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/home/user/supervisord.pid ; (supervisord pidfile;default supervisord.pid)

[supervisorctl]
serverurl=unix:///home/user/supervisor.sock ; use a unix:// URL  for a unix socket

Y por último añadimos una sección [program:x] para nuestra aplicación, acá tenemos que cambiar 8000 por el puerto que el panel de webfaction nos indique.

[program:webfactiontut]
command=/home/user/webapps/webfactiontut/env/bin/python manage.py run_gunicorn -b :8000 --name=%(program_name)s --log-level=DEBUG
directory=/home/user/webapps/webfactiontut/webfactiontut/
autostart=true
autorestart=true
stdout-logfile=/home/user/logs/user/webfactiontut.log
stderr_logfile=/home/user/logs/user/webfactiontut.log

Si todo esta configurado correctamente entonces podemos echar a andar nuestra aplicación de la siguiente manera

supervisord -c supervisord.conf

Y podemos chequear el estado de nuestra aplicación de la siguiente manera

supervisorctl webfactiontut status

supervisorctl status webfactiontut

Paso 4: Configurando el website

Ahora que ya tenemos configuradas las aplicaciones sólo falta configurar el website en el panel de webfaction.

Para esto creamos un nuevo website de nombre webfactiontut y le añadimos las 3 aplicaciones que creamos de la siguiente manera

  • webfactiontut en /
  • webfactiontut_static en /static
  • webfactiontut_media en /media

Y con esto se concluye el tutorial