Ir al contenido principal

Entradas

Mostrando entradas de 2012

Django y celery

Me he decidido a utilizar un sistema de cola de eventos en una aplicación de django. Lo que me ha llevado a tomar esta decisión es fundamentalmente evitar tener que esperar a que un proceso termine para poder seguir interactuando con la aplicación web. Por tanto celery me ofrece justo esto. Cuando hablamos de celery, siempre viene acompañado del backend RabbitMQ (cola de eventos de alto rendimiento). Pero hay otros sistemas menos complejos, como kombu, el cual utiliza la propia bbdd de django para el almacenamiento de mensajes. Tenemos la siguiente situación: - Django 1.3 con una aplicación que lanza procesos sobre diversos servidores - mod_wsgi para comunicar apache con django Estos son los dos sistemas que tendremos que tocar para añadir celery a nuestra aplicación. Tendremos que instalar lo siguiente: - pip install celery django-kombu django-celery - apt-get install supervisor ó yum install supervisor (depende del s.o.) Vamos a decirle a django que

Cambiar versión de python para django

A continuación explico como cambiar la versión de python que utiliza django, para disponer de una versión más nueva y con más posibilidades. El escenario sería el siguiente: - Red Hat Enterprise Linux Server release 5.1 - Apache/2.2.3 - Django 1.3 - mod_wsgi (para conexión entre apache y python) - Python 2.4.3 Queremos cambiar la versión de python para tener la 2.7.3. Lo primero que haremos será instalar la nueva versión de python: - Nos descargamos la versión 2.7.3: http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz - La ruta de instalación será, por ejemplo, /opt/python273, luego pasamos a compilar: tar xvfz Python-2.7.3.tgz cd /Python-2.7.3 ./configure --prefix=/opt/python273 make make altinstall Es importante hacer este make altinstall, pues vamos a instalar una versión alternativa de python, no queremos pisar la ya existente. Ya tenemos instalado python en la versión 2.7.3. Si en nuestro python/django tenemos instalado diversos paquetes, se

Establecer tiempo de sesión en django

Para controlar el tiempo de sesión en django, podemos hacer uso de las siguentes directivas dentro de nuestro settings.py: #Tiempo de vida de la sesión en segundos SESSION_COOKIE_AGE = 600 #Para que expire la sesión al cerrar el navegador. Por defecto está a False SESSION_EXPIRE_AT_BROWSER_CLOSE = True También es importante si tenemos varios proyectos publicados en el mismo apache, añadir la siguiente directiva: SESSION_COOKIE_NAME = 'cadena_distintiva' donde 'cadena_distintiva' deberá ser diferente, para que cada proyecto tenga una cookie diferente y no entre en conflicto con las de otros.

Limpiar django_sessions

Ocurre que la tabla de django "django_session" suele crecer de forma desmesurada, debido a que django por sí sólo no limpia las sesiones expiradas (en gran parte porque al salir no lo hacemos con logout). Para evitar que crezca esta tabla, django nos ofrece el siguiente comando: cleanup el cual limpia de la bbdd aquellas entradas de sesiones ya expiradas. Lo ideal por tanto, es añadir en el cron una entrada como esta: 0 8 * * * /usr/bin/python /ruta/proyecto/manage.py cleanup Para que periódicamente (a las 8 de la mañana por ejemplo) limpie las sesiones caducadas de nuestro proyecto django.

Montar un repositorio con Git

Ayer me entró la curiosidad sobre cómo utilizar el gestor de control de versiones git. Ya tengo montado mi repositorio en una máquina remota y configurado para realizar los cambios desde mi equipo para luego subirlos a producción. Os comento cómo hacer esto. Escenario: - Servidor de producción [SERVIDOR] . En este servidor tenemos corriendo una aplicación en django (en la ruta /opt/proyecto/aplicacionA). Aquí también motaremos nuestro repositorio remoto. Tendremos que tener git instalado (desde paquetería o compilando). - Equipo local [LOCAL]. Aquí es desde donde haremos los desarrollos, para posteriormente, subirlos a producción. Tendremos que tener git instalado (desde paquetería o compilando). Lo que sigue a continuación serán los pasos al estilo receta, para más info de git, acudir al sitio http://git-scm.com/book/es/ 1) Crear repositorio remoto - Accedemos por ssh a SERVIDOR - Creamos la ubicación del repositorio y lo iniciamos:     [SERVIDOR] mkdir /opt/rep

Sacar configuración importante de settings.py en Django

Es posible que necesitemos sacar cierta información de carácter sensible del fichero settings.py de un proyecto, bien por facilitar el trabajo con control de versiones, o por querer tener diferentes configuraciones entre entornos. Una manera sencilla de hacer esto es como se explica en https://code.djangoproject.com/wiki/SplitSettings. Por ejemplo, imaginemos que queremos sacar la información de bbdd. Para ello nos vamos a crear un fichero settings.ini en /etc, cuyo contenido será este: [database] DATABASE_NAME: nombre_bbdd DATABASE_USER: usuario DATABASE_PASSWORD: pass DATABASE_HOST: localhost DATABASE_PORT: 3306 Luego tan sólo tendremos que modificar nuestro settings.py añadiendo esto: from ConfigParser import RawConfigParser config = RawConfigParser() config.read('/etc/settings.ini') Y en la sección DATABASES configuraremos lo siguiente: DATABASES = {     'default': {         'ENGINE': 'django.db.backends.mysql',         'N

Corregir problemas de codificación en Django

Para evitar errores de codificación en Django del tipo:  django 'ascii' codec can't encode character u'\xf3' debido a la codificación que tenga por defecto python (que suele ser ascii), simplemente tenemos que añadir a nuestro settings.py las siguientes líneas: import sys reload(sys) sys.setdefaultencoding( "utf-8" ) Y conseguiremos establecer la codificación adecuada.

Ejecutar comandos personalizados de Django desde el cron

Para poder ejecutar comandos personalizados de django desde el cron, necesitaremos aplicar el siguiente parche (si es que aún no lo trae): https://code.djangoproject.com/attachment/ticket/5825/managepath.diff Información obtenida de https://code.djangoproject.com/ticket/5825 Una vez aplicado el parche, ya podremos invocar nuestro comando de la siguiente manera: minutos hora * * * /usr/bin/python /sitio/proyecto/django/manage.py comando

Definir rango de puertos del ftp en alfresco 3.2

Debido a que el servicio de ftp de alfresco funciona en modo pasivo, este abrirá puertos por encima del 1024 para llevar a cabo la comunicación de datos. Si tenemos un firewall muy restrictivo, nos interesará definir un rango determinado de puertos y abrir sólo ese rango. Para definir el rango de puertos debemos añadir a /tomcat/shared/classes/alfresco-global.properties los siguientes parámetros: ftp.dataPortFrom=50000 ftp.dataPortTo=60000 En este caso estamos definiendo el rango del 50000 al 60000. Veamos si esto funciona de verdad. Hacemos un ftp en modo debug a nuestro servidor: ftp -d 192.168.60.13 2122 Connected to 192.168.60.13. 220 FTP server ready ftp: setsockopt: Bad file descriptor Name (servidor:rafa): usuario ---> USER usuario 331 User name okay, need password for usuario Password: ---> PASS XXXX 230 User logged in, proceed ---> SYST 215 UNIX Type: Java FTP Server Remote system type is UNIX. Indicamos el modo pa

Enlaces libros

Ahí va un listado de algunos enlaces interesantes para descargar tanto libros técnicos como de literatura: http://www.etnassoft.com/ biblioteca/ http://pythonbooks.revolunet. com/ http://papyrefb2.net/frames/ index.php http://epubgratis.me/ http://www.flasheditors.net/ http://es.tldp.org/htmls/ manuales.html http://www.ebook3000.com/ http://www.amazon.es/s/ref=sr_ hi_2?rh=n%3A818936031%2Cn%3A! 827236031%2Cn%3A!827237031% 2Cn%3A1354901031&bbn= 1354901031&ie=UTF8&qid= 1328260722 A disfrutarlos....

Error al configurar Oracle Enterprise Manager Database Control

Al instalar Oracle 11gR2 en Ubuntu 11.04, me saltó un error en la parte de configuración del Database Control. No le presté mucha atención y posteriormente la intenté configurar lanzando: emca -config dbcontrol db pero tras introducir los datos, me volvió a escupir el mensaje de error: 27-ago-2012 12:25:57 oracle.sysman.emcp.EMConfig perform INFO: Esta operación se está registrando en /u01/app/oracle/cfgtoollogs/emca/orcl/emca_2012_08_27_12_25_44.log. 27-ago-2012 12:25:58 oracle.sysman.emcp.EMConfig perform GRAVE: Fallo al asignar puertos en los rangos especificados para los siguientes procesos: JMS [5540-5559],RMI [5520-5539],Database Control [5500-5519],EM Agent [3938] | [1830-1849] Consulte el archivo log en /u01/app/oracle/cfgtoollogs/emca/orcl/emca_2012_08_27_12_25_44.log para obtener más información. No se ha podido terminar la configuración. Consulte el archivo log en /u01/app/oracle/cfgtoollogs/emca/orcl/emca_2012_08_27_12_25_44.log para obtener más informaci

subprocess en python

Vamos a ver cómo hacer un script de parada/arranque de un servicio utilizando subprocess. subprocess nos va a permitir lanzar un comando y esperar a que este termine, y una vez terminado, ver en qué estado ha finalizado. El siguiente ejemplo se puede utilizar para llevar a cabo un reinicio automático de un servicios (jboss por ejemplo) y estar seguros de que el servicio es detenido y arrancado correctamente: #!/usr/bin/env python # -*- coding: iso-8859-15 -*- import subprocess script_arranque='/etc/init.d/jboss start' script_parada='/etc/init.d/jboss stop' #paramos jboss pipe=subprocess.Popen(script_arranque, stdout=subprocess.PIPE, shell=True) estado=pipe.wait() out, err = pipe.communicate() if estado == 0:         print "Estado salida correcto." else:         print "Salida de error: " + str(err)   '''en este caso, el único proceso java que corre es jboss, si hubiese más de uno, la siguiente opción no sería válid

Envío de correo en python bajo SSL

Si necesitáis enviar correos con python por ssl de una forma sencilla, recomiendo el uso de pyzmail ( http://www.magiksys.net/pyzmail/ ). Para instalar pyzmail, lo podéis hacer directamente con pip: pip install pyzmail Si no tenemos instalado pip, para instalarlo: wget http://python-distribute.org/distribute_setup.py  python distribute_setup.py  easy_install pip Os dejo un sencillo código de ejemplo: # -*- coding: iso-8859-15 -*- import pyzmail #Componemos el correo sender=('Yo','cuenta@remitente.es') recipients=['cuenta@destinatario.es',] subject='Prueba envio SSL' text_content='Este correo ha sido enviado bajo SSL' prefered_encoding='iso-8859-1' text_encoding='iso-8859-1' #Vamos a adjuntar dos ficheros fichero=open('fichero.txt.tar.gz', 'rb').read() fichero2=open('fichero.txt','rb').read() payload, mail_from, rcpt_to, msg_id=pyzmail.compose_mail( sender, recipient

Conexión a bbdd oracle desde python

Para poder acceder a una bbdd oracle desde python tan sólo necesitaremos tener instalado: - cliente oracle (lo puedes obtener de la página de oracle y registrándote en la misma) - extensión cx_Oracle (lo puedes descargar desde la página http://cx-oracle.sourceforge.net/) La forma de utilizarlo lo podemos ver en el siguiente ejemplo: Con este script se pretende actualizar el campo de una tabla pasándole tres argumentos, dos para filtrar el dato y uno que será el nuevo valor. También hacemos uso de optparse para pasear los argumentos. #!/usr/bin/python # -*- coding: iso-8859-15 -*- import cx_Oracle, sys, os, datetime from optparse import OptionParser conn_str='usuario/pass@host:port/bbdd' log = '/ruta/para/log/script.log' #Fucion para escribir log def log (texto):         now = datetime.datetime.now()         f = open(log_propio, 'a')         f.write(str (now.ctime()) + ' -> ' + texto + '\n')         f.close() #Se parsea

Curso Django Segunda Parte

Continuamos con la segunda parte del mini curso de django. Respecto a la primera parte, he añadido una par de cosas: - La instalación de un paquete más: python-pygraphviz - Y la aplicación de un parche para django-smart-selects: https://github.com/GrAndSE/django-smart-selects/commit/7e2a8d572b3615cc39a3c9f9d60e1b60de06f46f Pues bien, ya tenemos creado un proyecto llamado misitio. Ahora es el momento de crear nuestra aplicación, la cual llamaremos inventario. Para crear un aplicación, simplemente hacemos: cd /opt/djcode/misitio python manage.py startapp inventario Tras la ejecución de este comando (que no devuelve nada por pantalla), tendremos un nuevo directorio bajo el proyecto misitio: ls -l inventario/ -rw-r--r-- 1 root root   0 mar 11 12:27 __init__.py -rw-r--r-- 1 root root  57 mar 11 12:27 models.py -rw-r--r-- 1 root root 383 mar 11 12:27 tests.py -rw-r--r-- 1 root root  26 mar 11 12:27 views.py De los ficheros que nos podemos encontrar, tenemos: