Mostrando entradas con la etiqueta django. Mostrar todas las entradas
Mostrando entradas con la etiqueta django. Mostrar todas las entradas

lunes, 13 de julio de 2015

Include como php en Python + Django

En uno de los proyectos que estoy trabajando me tope con este detalle después de buscar en varios foros y demás encontre la siguiente forma, nada más cuidado por que baja el rendimiento, y hay que revisar las cuestiones de seguridad (http://lucumr.pocoo.org/2011/2/1/exec-in-python/); pero eso si funciona perfectamente y puede servir dependiendo de la aplicación; esto se lográ utilizando la instrucción exec.

El proyecto completo lo pueden descargar de: https://github.com/omaryahir/django_doing_includes

Aquí comento la parte importante dentro del archivo models.py estoy agregando un fragmento de código que manda llamar el archivo prueba.py :


db/models.py:

from django.db import models

class Person(models.Model):
    first_name = models.CharField(verbose_name=u'Nombre', max_length=50)
    last_name = models.CharField(verbose_name=u'Apellido', max_length=50)
    initials = models.CharField(verbose_name=u'Iniciales', max_length=10)

    def save(self, *args, **kwargs):
        prueba_py = open('db/prueba.py','r')
        super(Person, self).save(*args, **kwargs)
        exec(prueba_py)
        print self.initials

    def __unicode__(self):
        return "%s %s" % (self.first_name, self.last_name)


class Otro(models.Model):
    otrocampo = models.CharField("otro campo", max_length=50)
    person = models.ForeignKey(Person)

    class Meta:
        verbose_name = "Otro"
        verbose_name_plural = "Otros"

db/prueba.py:

self.initials = "Esta es la prueba"
x = Otro()
x.otrocampo = "Prueba otro campo"
x.person = self
x.save()
print "Saliendo"

Como pueden observar en el código la línea - prueba_py = open('db/prueba.py','r')- de la clase Person se abre el archivo prueba.py y posteriormente en la línea - exec(prueba_py) - ejecutamos su contenido; lo interesante aquí de python es que carga todo el contexto, algo similar a lo que se hacia con php haciendo un include.

Podemos observar en el archivo prueba.py que dentro del archivo usamos las variables como si estas se encontrarán ahí, bien sin embargo en python una de las cualidades que tenemos el rendimiento, por lo que este tipo de usos puede afectarlo, se debe analizar en donde se requerirá su uso.

Si encuentras otra forma no dudes en compartirla ...

Saludos espero te sea de utilidad !


Referencias:
https://docs.python.org/3/library/functions.html?highlight=exec#exec
http://lucumr.pocoo.org/2011/2/1/exec-in-python/
https://github.com/omaryahir/django_doing_includes

domingo, 12 de julio de 2015

Django: ubuntu + nginx + gunicorn + supervisor + mysql

Tengo que instalar en una maquina virtual con virtualbox un deployment de un proyecto que debo entregar dejaré aqui los pasos que me funcionaron, ya tenía un post de deployment con uwsgi, pero ha quedado un poco desactualizado.

Bien voy colocando cada uno de los comandos:

$ sudo apt-get install python-virtualenv

Hay algunas otras herramientas que necesitamos instalar para el uso de django en ubuntu:

$ sudo apt-get install mysql-server
$ sudo apt-get install libmysql++-dev
$ sudo apt-get install python-dev
$ sudo apt-get install python-mysqldb
$ sudo apt-get install build-essential python

Crear una carpeta donde tendremos nuestras aplicaciones web:

$ sudo mkdir -p /webapps/carpeta_proyecto
$ sudo chown administrador /webapps/carpeta_proyecto

Creamos nuestro directorio virtual:

$ cd /webapps/carpeta_proyecto
$ virtualenv venv
$ source venv/bin/activate

Cargamos en ese directorio una carpeta con el código de nuestro proyecto, en mi caso lo tengo en bitbucket por lo que usando este comando descargo el código.

(venv)$ git clone http://bitbucket.org/tu_usuario/miproyecto.git

De esta forma tendremos dos directorios uno con el nombre de nuestro proyecto <miproyecto> y por otro lado tendremos un directorio con el entorno virtual <venv>.

Ahora instalamos el entorno en mi proyecto tengo un archivo requirements.txt, pero igual mínimo necesitamos instalar django y la librería de mysql, lo instalamos usando pip.

(venv)$ pip install django
(venv)$ pip install python-mysql

Es probable que para el proyecto tengan que correr un python manage.py syncdb o migrate para que puedan cargar la base de datos del proyecto, hasta este punto debemos poder probar el proyecto y ver que se encuentre funcionando correctamente usando un runserver.

Una vez que lo anterior se encuentre funcionando vamos ahora a realizar directamente el deployment.

Primero iniciamos instalando gunicorn, para eso utilizamos:

(venv)$ pip install gunicorn

Podemos probar el funcionamiento de gunicorn utilizando:

(venv)$ cd miproyecto
(venv)$ gunicorn miproyecto.wsgi:application --bind 0.0.0.0:8080

NOTA: La carpeta miproyecto, es el directorio que django crea cuando ejecutamos un startproject.

Al ejecutar el comando anterior gunicorn inicia un servidor en el puerto 8080 para ejecutar nuestro proyecto, sin embargo puede ser que el contenido estático no funcione correctamente.

Ahora para hacerlo más dinámico realizamos lo siguiente, creamos un archivo en mi caso yo lo deje en carpeta_proyecto/deployment/gunicorn_run y le copiamos dentro el siguiente contenido:

#!/bin/bash

NAME="miproyecto_app"                                        # Nombre de la app
DJANGODIR=/webapps/carpeta_proyecto/miproyecto               # directorio del proyecto de Django
SOCKFILE=/webapps/carpeta_proyecto/deployment/gunicorn.sock  # Nos comunicaremos utilizando este unix socket
USER=miusuario                                               # Correr con el usuario
GROUP=grupousuario                                           # Correr como el grupo 
NUM_WORKERS=3                                                # Cuantos - worker processes - de Gunicorn 
DJANGO_SETTINGS_MODULE=miproyecto.settings                   # Archivo settings de Django
DJANGO_WSGI_MODULE=miproyecto.wsgi                           # Archivo WSGI del proyecto

echo "Starting $NAME as `whoami`"

# Activando el entorno
cd $DJANGODIR
source ../venv/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

# Crear el directorio para correrlo en caso de no existir
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

# Iniciando Django Gunicorn
exec ../venv/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
  --name $NAME \
  --workers $NUM_WORKERS \
  --user=$USER --group=$GROUP \
  --bind=unix:$SOCKFILE \
  --log-level=debug \
  --log-file=-


Posteriormente convertimos el archivo como ejecutable usando el comando:

(venv)$ sudo chmod u+x gunicorn_run

Para probar el gunicorn podemos ejecutar el archivo de esta forma hacemos lo siguiente:

(venv)$ ./gunicorn_run

Una vez que se haya logrado ejecutar sin problemas, ahora, instalamos supervisor.

(venv)$ sudo apt-get install supervisor

Después de instalar supervisor vamos a crear el archivo /etc/supervisor/conf.d/miproyecto.conf con el siguiente contenido:

[program:miproyecto]
command = /webapps/carpeta_proyecto/deployment/gunicorn_run               ; Comando para iniciar la app
user = miusuario                                                          ; Usuario que lo va ejecutar
stdout_logfile = /webapps/carpeta_proyecto/logs/gunicorn_supervisor.log   ; Ruta del archivo log
redirect_stderr = true                                                    ; Alamcenar stderr en el mismo log
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8                           ; Establecer UTF-8 por default

Creamos el directorio logs y el archivo para almacenar el gunicorn_supervisor.log dentro del directorio de carpeta_proyecto.

(venv)$ mkdir /webapps/carpeta_proyecto/logs
(venv)$ touch /webapps/carpeta_proyecto/logs/gunicorn_supervisor.log

Posteriormente utilizamos para cargar el supervisor:

(venv)$ sudo supervisorctl reread
miproyecto: available
(venv)$ sudo supervisorctl update
miproyecto: added process group

Ahora para revisar el estatus del proyecto podemos utilizar:

(venv)$ sudo supervisorctl status miproyecto
miproyecto                            RUNNING    pid 2277, uptime 0:01:40

Podemos iniciar, parar o reiniciar el proyecto utilizando:

(venv)$ sudo supervisorctl stop miproyecto
miproyecto: stopped
(venv)$ sudo supervisorctl start miproyecto
miproyecto: started
(venv)$ sudo supervisorctl restart miproyecto
miproyecto: stopped
miproyecto: started

Ahora vamos con Nginx, para instalarlo utilizamos:
(venv)$ sudo apt-get install nginx

Para iniciar el servicio podemos utilizar:
$ sudo service nginx start

Con esto el servidor de nginx se activará, puede probarse, por omisión el puerto es el 80. Ahora bien lo que haremos es crear el archivo /etc/nginx/sites-available/miproyecto con el siguiente contenido:

upstream miproyecto_app_server {
  # fail_timeout=0 means we always retry an upstream even if it failed
  # to return a good HTTP response (in case the Unicorn master nukes a
  # single worker for timing out).

  server unix:/webapps/carpeta_proyecto/deployment/gunicorn.sock fail_timeout=0;
}

server {

    listen   80;
    server_name example.com;

    client_max_body_size 4G;

    access_log /webapps/carpeta_proyecto/logs/nginx-access.log;
    error_log /webapps/carpeta_proyecto/logs/nginx-error.log;

    location /static/ {
        # path to static folder         alias   /webapps/carpeta_proyecto/miproyecto/static/
    }
    
    location /media/ {
        # path to media folder
        alias   /webapps/carpeta_proyecto/miproyecto/media/;
    }

    location / {
        # an HTTP header important enough to have its own Wikipedia entry:
        #   http://en.wikipedia.org/wiki/X-Forwarded-For
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # enable this if and only if you use HTTPS, this helps Rack
        # set the proper protocol for doing redirects:
        # proxy_set_header X-Forwarded-Proto https;

        # pass the Host: header from the client right along so redirects
        # can be set properly within the Rack application
        proxy_set_header Host $http_host;

        # we don't want nginx trying to do something clever with
        # redirects, we set the Host: header above already.
        proxy_redirect off;

        # set "proxy_buffering off" *only* for Rainbows! when doing
        # Comet/long-poll stuff.  It's also safe to set if you're
        # using only serving fast clients with Unicorn + nginx.
        # Otherwise you _want_ nginx to buffer responses to slow
        # clients, really.
        # proxy_buffering off;

        # Try to serve static files from nginx, no point in making an
        # *application* server like Unicorn/Rainbows! serve static files.
        if (!-f $request_filename) {
            proxy_pass http://miproyecto_app_server;
            break;
        }
    }

    # Error pages
    error_page 500 502 503 504 /500.html;
    location = /500.html {
        root /webapps/carpeta_proyecto/miproyecto/static/;
    }
}

De la misma manera que en los archivos anteriores personalizamos el contenido donde el color esta en negritas.

Ahora creamos el symbolic link en la carpeta sites-enabled (Esta carpeta nos permite indicar a nginx cuales sitios están habilitados).

$ sudo ln -s /etc/nginx/sites-available/miproyecto /etc/nginx/sites-enabled/miproyecto

Posteriormente reiniciamos nuestro servidor nginx:

$ sudo service nginx restart

Si hay algún error hay que revisar los directorios de los archivos, por otro lado en caso de que aparezca la pantalla de bienvenida de nginx al momento de volver a probar es debido al archivo default, en caso de que no vayamos a utilizar podemos eliminar su archivo símbolico desde el directorio de sites-enabled, una vez realizado lo anterior reiniciamos de nuevo el servidor de nginx.

$ sudo service nginx restart

Posterior a esto deberá funcionar correctamente el sitio.


Espero te sea de utilidad !



Referencias:
http://michal.karzynski.pl/blog/2013/06/09/django-nginx-gunicorn-virtualenv-supervisor/
http://michal.karzynski.pl/blog/2013/10/29/serving-multiple-django-applications-with-nginx-gunicorn-supervisor/

domingo, 11 de enero de 2015

virtualenvwrapper en mac osx

Para instalar virtualenvwrapper se debe hacer con pip, siguiendo estos comandos:

$ sudo easy_install pip
$ sudo pip install virtualenv
$ sudo pip install virtualenvwrapper

Es posible que pip o virtualenv ya los tengas instalados así que si es así puedes omitir esos pasos, ahora bien, aquí viene por que no me funcionaba a mi, debes editar el archivo ~/.bashrc o ~/.zshrc (si estas usando oh my zsh, altamente recomendable) y colocar la siguiente línea:


source /usr/local/bin/virtualenvwrapper.sh

Con lo anterior estará funcionando el virtualenvwrapper, al parecer todo el asunto esta que lo cargue antes, fue una forma que encontre de resolverlo, si encontraste alguna otra no dudes en compartirla.

Espero te sea de utilidad !


Referencias:

jueves, 8 de enero de 2015

unix: var run supervisor.sock or tmp.sock no such file o no encontrado

Después de haber cargado un servidor en suse con un deploy con Django sobre nginx, supervisor y gunicorn (Aquí la guía que seguí) tuvimos un proceso de reinicio de servidor y posteriormente al querer correr el nginx con el supervisor marcaba el error:

unix:///var/run/tmp.sock no such file

Buscando en internet encontré que también podría marcar el error de la siguientes formas:

unix:///var/run/supervisor.sock archivo no encontrado
unix:///var/run/supervisor.sock no such file

El detalle es que el supervisor tiene que ser reiniciado de forma manual de acuerdo a la referencia entonces se necesita realizar nuevamente el comando:

$ sudo supervisord

De esta forma se reiniciará y cargará nuevamente el supervisor, es importante recordar que se tiene que estar en el directorio del archivo supervisord.conf

Gracias a la referencia fue que encontré la solución.


Espero te sea de utilidad !


Referencias:
https://github.com/Supervisor/supervisor/issues/121


martes, 2 de diciembre de 2014

Django, suse, nginx, Gunicorn y supervisor

Como siempre, por necesidad me veo en la tarea de implementar dentro de un servidor suse montado en un AWS EC2, el servicio de ngix para un proyecto en django usando gunicorn y supervisor.

Esta guía esta basada al 100% del video: https://www.youtube.com/watch?v=VDVNgivbvYk la diferencia es que en esta guía se está usando SUSE resolviendo el tema de instalación de nginx fuera de yast.

Lo primero que debemos considerar es que este funcionando python, django y virtual-env que se escapan a este post. Por lo que el proyecto debe estar funcionando si ejecutamos:

# python manage.py runserver 0.0.0.0:8000 

Para instalar gunicorn que puede ser usando la instrucción:

# pip install gunicorn


Posteriormente podemos probar si esta funcionando, entrando al directorio de nuestro proyecto de django y haciendo lo siguiente:

# gunicorn miproyecto.wsgi:application --bind 0.0.0.0:8080

________________________________
Nota:
Si lo queremos poner como servicio:
$ gunicorn miproyecto.wsgi:application --bind 0.0.0.0:8080 --pid /tmp/gunicorn.pid --workers=3 --daemon
Para detenerlo debemos verificar su id de proceso:
$ cat /tmp/gunicorn.pid
####
$ kill -9 ####
________________________________

Si entramos al navegador y usamos la ip del equipo deberiamos ser capacez de ver el proyecto en ejecución: http://IP-del-servidor:8080/

Ahora instalaremos supervisor para mantener todo el tiempo nuestro servidor activo.

El proceso para instalarlo es el siguiente:

# pip install supervisor

Una vez instalado usaremos el archivo supervisord.conf de referencia para obtenerlo usamos el siguiente comando:

# echo_supervisord_conf > ./supervisord.conf

Una vez obtenido lo editaremos usando el siguiente comando:

# vi supervisord.conf

Al final del archivo agregamos las siguientes líneas:

;CONFIGURACION BASICA GUNICORN
[program:gunicorn]
;ruta donde se encuentra el directorio virtual que ejecutara gunicorn
command=/home/ruta-a-virtualenv/virtualmachine/bin/gunicorn miproyecto.wsgi:application --bind 0.0.0.0:8080 --workers=3 --pid /tmp/gunicorn.pid
;Ahora indicamos el directorio donde se almacena el proyecto ...
directory=/home/ruta-al-pryecto/miproyecto/

Una vez teniendo el archivo configurado, podemos ejecutar el servicio usando:

# supervisord

Con eso el servicio esta en ejecución una forma de revisar que se encuentre en ejecución, es revisando que el archivo /tmp/gunicorn.pid se haya generado y tenga el número de proceso del servicio.

Otra forma de ver el servicio es usando el siguiente comando:

# supervisorctl

Para parar el servicio de supervisor:

# supervisorctrl stop gunicorn
________________________________
Nota: En caso de que necesites recargar el archivo de configuración (a mi me paso jeje), puedes entrar con el comando:
$ supervisorctl
Y posteriormente teclear reload:
supervisor> reload
Pedirá confirmar y posteriormente se recargará la configuración
________________________________

Hasta este momento siguiendo los link de referencias logre montar el servidor gunicorn con supervisor.

Ahora vamos a crear un archivo bash de nombre gunicorn_run en la raíz del proyecto django; con el siguiente contenido:

#!/bin/bash
NAME="miproyecto_app" # Nombre del proyecto
DJANGODIR=/home/ruta-al-proyecto/miproyecto #Directorio del proyecto
SOCKFILE=/home/rutal-al-proyecto/run/gunicorn.sock #Ruta del SockFile para nginx
USER=django  # Usuario que ejecute las instancias 
GROUP=django # Grupo del usuario que ejecute las instancias
NUM_WORKERS=3 # 2 * CPUs + 1
DJANGO_SETTINGS_MODULE=miproyecto.settings # Modulo settings del proyecto
DJANGO_WSGI_MODULE=miproyecto.wsgi # Nombre de la aplicacion para WSGI
echo "Iniciando $NAME como `whoami`"

# Activando el ambiente virtual
cd $DJANGODIR
source /home/ruta-a-virtualenv/virtualmachine/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

# Creando el directorio del archivo gunicorn.sock por si no existe
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

# Comando que ejecuta supervisor para correr el servidor gunicorn
exec /home/ruta-a-virtualenv/virtualmachine/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--user=$USER --group=$GROUP \
--bind=unix:$SOCKFILE \
--log-level=debug \
--log-file=-



Una vez que completemos el archivo y llenemos las secciones que debemos personalizar aplicaremos los persmisos:

# chmod u+x gunicorn_run

Detenemos el gunicorn en caso de tenerlo activo con supervisor, (supervisorctl stop gunicorn) y actualizaremos el supervisord.conf, sustituyendo las líneas que habíamos agregado por:


;CONFIGURACION AVANZADA GUNICORN (Activa)
[program:gunicorn]
;ruta donde se encuentra el archivo bash
command=/home/ruta-al-proyecto/miproyecto/gunicorn_run
;usuario que ejecuta el bash y el comando
username=root
;log de eventos para la gestion de errores
stdout_logfiles=/home/ruta-al-proyecto/logs/gunicorn_supervisor.log
redirect_stderr=true
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8

Una vez realizado lo anterior generaremos la carpeta de logs:

# mkdir /home/ruta-al-proyecto/logs/

Ahora iniciamos con la instalación de nginx en suse. Para realizarlo ejecutamos, los siguientes comandos:

# wget http://nginx.org/download/nginx-1.6.0.tar.gz
# tar xvf nginx-1.6.0.tar.gz
# ./configure
# make
# make install


----
Para hacerlo servicio se debe crear el siguiente archivo:

# vi /etc/init.d/nginx

Con el siguiente contenido:

#! /bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/nginx/sbin
DAEMON=/usr/local/nginx/sbin/nginx
NAME=nginx
DESC=nginx
PIDFILE=/usr/local/nginx/logs/$NAME.pid
DAEMON_CONFIG=/usr/local/nginx/conf/nginx.conf

test -x $DAEMON || exit 0

set -e

case "$1" in
 start)
        echo -n "Starting $DESC: "
        start-stop-daemon --start --quiet --pidfile $PIDFILE \
                --exec $DAEMON
        echo " started"
        ;;
 stop)
        echo -n "Stopping $DESC: "
        if [ -f $PIDFILE ]; then
                kill -15 `cat $PIDFILE 2>/dev/null`
        fi
        echo " stopped"
        ;;
 restart|force-reload)
        echo -n "Restarting $DESC: "
        if [ -f $PIDFILE ]; then
                kill -15 `cat $PIDFILE 2>/dev/null`
        fi
        sleep 1
        start-stop-daemon --start --quiet --pidfile $PIDFILE \
                --exec $DAEMON
        echo " restarted"
        ;;
 status)
        echo "Status $DESC: "
        ps aux | grep -v grep | grep -v /bin/sh | grep $NAME
        ;;
 *)
        N=/etc/init.d/$NAME
        echo "Usage: $N {start|stop|status|restart}" >&2
        exit 1
        ;;
esac

exit 0

Le damos permisos de ejecución al archivo nginx:

# cd /etc/init.d/
# chmod +x nginx

Ahora lo que vamos hacer es modificar el archivo de configuración:

# vi /usr/local/nginx/conf/nginx.conf

Localizar la línea: # user  nobody

De esa línea eliminar el caracter '#'.

Una vez realizado lo anterior usaremos la instrucción para agregar la configuración:

# chkconfig -a nginx
# chkconfig --level 345 nginx on

Con lo anterior queda configurado el servicio y podemos iniciarlo o pararlo con las instrucciones:

# service nginx start  
# service nginx stop

Ahora lo que realizaremos será configurar el archivo del sitio:

# vi /usr/local/nginx/conf/nginx.conf

Dentro del archivo colocaremos lo siguiente sustituyendo la sección del servidor 80 o bien dejando el actual con 8080:

upstream miproyecto_app {
        # Este es el que conecta con gunicorn con nginx
        server unix:/home/rutal-al-proyecto/run/gunicorn.sock fail_timeout=0;
}

server {

        # Puerto de escucha
        listen 80;

        # Dominios que responden a esta configuracion
        server_name example.com

        # Configuracion customizada para la subida de statics
        client_body_in_file_only clean;
        client_body_buffer_size 32K;
        
        client_max_body_size 300M;

        sendfile on;
        send_timeout 300s;

        # Logs de eventos
        access_log /home/rutal-al-proyecto/logs/nginx-access.log;
        error_log /home/rutal-al-proyecto/logs/nginx-error.log;

        # Archivos estaticos
        location /static/ {
                alias /home/rutal-al-proyecto/static/;
        }

        # Archivos media
        location /media/ {
                alias /home/rutal-al-proyecto/media/;
        }

        # Procesando django
        location / {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_redirect off;
                if (!-f $request_filename) {
                        proxy_pass http://miproyecto_app;
                        break;
                }
        }

        # Error pages
        error_page 500 502 503 504 /500.html;
        location = /500.html {
                root /home/rutal-al-proyecto/;
        }



}

Necesitaremos levantar el servicio del gunicorn debemos recordar el proceso o levantarlo nuevamente es posible que necesiten entrar a la maquina virtual para entrar a supervisorctl start gunicorn, o bien es necesario también usar reload para que actualice el servicio con el archivo de configuración de supervisord.conf.

Nota: También es posible que necesitemos crear el archivo 500.html

Una vez levantado el supervisor con gunicorn, ahora levantaremos el servicio de nginx usando:

# service nginx restart

Ha sido toda una odisea en el camino casi me decido por dejarlo, pero igual funcionó, les agradezco si encuentran alguna mejora se agradece ya que hay varias cosas que seguramente puedan mejorarse.


Apuntes adicionales:

Apunte 1: Para ver servicios en ejecución en suse puedes utilizar:

$ ps aux | grep

Ejemplo:

$ ps aux | grep gunicorn

Con lo anterior puedes ver el id en la segunda columna y si es necesario puedes detenerlo:

$ kill -9 ####

Apunte 2: (Añadido 2014-12-11):

Si se necesita actualizar el código del proyecto de django puede hacerse realizando lo siguiente, se debe entrar al virtualenv y con eso parar el servidor con:

# supervisorctrl stop gunicorn

# supervisorctrl start gunicorn


Apunte 3: (Añadido 2015-01-20):


En esta ocasión nos paso que no podíamos configurar en el puerto 80 el servicio, por lo que lo que tuvimos que hacer fue: revisar en si en la configuración de ngnix se estén cargando otros archivos de configuración generalmente antes del server {} si es así comentar las siguientes instrucciones agregando #, esto es:

# include /etc/nginx/conf.d/*.conf;
# incude /etc/nginx/sites-enabled/*;

O bien revisar si estos archivos no estén causando algún conflicto con el puerto 80.



Espero te sea de utilidad !




sábado, 15 de noviembre de 2014

Instalar ninja-ide en mac os x


Bien para continuar con un proyecto que estoy desarrollando en python-django, he probado varias herramientas de desarrollo y me ha gustado el rendimiento de este entorno; sin embargo me dio varios problemas para instalarlo en mac.

Para algunas herramientas utilice homebrew, y wget, si no los tienes instalados usa los siguientes comandos:

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ brew install wget

Para instalar la herramienta entonces iniciamos con los siguientes comandos:

$ sudo pip install macfsevents

Por alguna razón, y puede ser por tener múltiples instancias de python (las cuáles no puedo mover mucho debido a otros proyectos de trabajo), las siguientes herramientas no me permitió instalarlas con pip por lo que las descargue directamente desde los sitios usando wget.

$ mkdir ninja-ide_app
$ cd ninja-ide_app
$ mkdir install
$ cd install
$ wget http://sourceforge.net/projects/pyqt/files/sip/sip-4.16.4/sip-4.16.4.tar.gz
$ tar -xzvf sip-4.16.4.tar.gz
$ cd sip-4.16.4 
$ python configure.py 
$ make 
$ make install 

wget http://sourceforge.net/projects/pyqt/files/PyQt4/PyQt-4.11.3/PyQt-mac-gpl-4.11.3.tar.gz
tar -xzvf PyQt-mac-gpl-4.11.3.tar.gz 
cd PyQt-mac-gpl-4.11.3 
python configure-ng.py      
(escribe yes para aceptar la licencia)
$ make                                  
(puede tardar unos minutos)
$ make install


$ wget https://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.11.6.tar.gz 
tar -xzvf virtualenv-1.11.6.tar.gz 
$ cd virtualenv-1.11.6
python setup.py install

$ wget http://sourceforge.net/projects/pyqt/files/QScintilla2/QScintilla-2.8.4/QScintilla-gpl-2.8.4.tar.gz
 tar -xzvf QScintilla-gpl-2.8.4.tar.gz 
cd QScintilla-gpl-2.8.4
$ cd Qt4Qt5 
$ qmake qscintilla.pro 
$ make
$ make install
$ cd ..

$ cd Python 
(Python Bindings)
$ python configure.py 
$ make
$ make install 

$ cd ..
$ cd ..
$ cd ..

$ git clone https://github.com/ninja-ide/ninja-ide.git ninja-ide
$ cd ninja-ide 
$ python ninja-ide.py 

Si todo sale bien ya tienes el entorno instalado puedes agregar al bash_profile un alias para que desde la terminal puedas llamarlo.


Espero te sea de utilidad !



Referencias:
http://ninja-ide.org/
https://github.com/ninja-ide/ninja-ide-documentation/blob/master/docs/installing.rst
http://scoobygalletas.blogspot.mx/2011/09/como-instalar-ninja-ide-en-mac-os-x.html
http://pyqt.sourceforge.net/Docs/PyQt4/installation.html
http://www.riverbankcomputing.com/software/sip/download
http://pyqt.sourceforge.net/Docs/QScintilla2/
https://github.com/ninja-ide/ninja-ide/blob/705b6d005ab4db7844f7805d1b10a24732045adf/README.md#requirements
https://github.com/ninja-ide/ninja-ide/issues/1833

jueves, 29 de mayo de 2014

Secuencia de Django South Migration

Una vez instalado south, y haberlo agregado al archivo settings.py dentro de INSTALLED_APPS, la secuencia es:

  1. Crear físicamente la base de datos
  2. Ejecutar comando: $ manage.py schemamigration app --initial
  3. Ejecutar comando: $ manage.py syncdb   
  4. En el paso anterior no se crearon las tablas de la aplicación puesto que eso se realizará con el comando siguiente.
  5. Ejecutar comando: $ manage.py migrate app

Ahora bien si hubo un cambio:
  1. Ejecutar comando: $  manage.py schemamigration app --auto
  2. Ejecutar comando: $  manage.py migrate app

¿Te fué de utilidad?

martes, 22 de abril de 2014

Instalación OpenSUSE 13.1 - VirtualEnv - Python - Django - MySQL

Como parte de un proyecto en mi trabajo es necesario utilizar django dentro de opensuse, para lo cuál realizaremos lo siguiente:

1. Instalación de VirtualEnv
Utilizando la terminal ejecutamos:
> sudo zypper install python-virtualenv  
NOTA: Será necesario tener instalado zypper en caso de no tenerlo a travéz de Yast.

2. Iniciar el proyecto con virtualenv
Utilizando los siguientes comandos ...
> mkdir miproyecto  
> virtualenv vmp  


3. Instalar el soporte de Mysql
Para instalar el soporte de MySQL es importante considerar tener el MySQL instalado, para instalar en OpenSUSE puede ser la siguiente guía: http://omaryahir.blogspot.mx/2014/04/opensuse-131-y-mysql.html

Una vez que el MySQL se encuentra instalado ejecutamos:
> sudo zypper instalpython-devel 
> sudo zypper install libmysqlclient-devel 
> sudo zypper install gcc 

4. Activamos la maquina e instalamos django
Con el punto anterior tenemos una maquina virtualenv con nombre vmp por lo que la activaremos con los siguientes comandos para instalar la versión más reciente de django y el soporte de mysql.
> source vmp/bin/activate  
(vmp) > pip install django  
(vmp) > pip install mysql-python  

Con lo anterior debe de poder funcionar correctamente django con soporte MySQL en OpenSUSE.

Espero te sea de utilidad !



Referencias:







sábado, 11 de enero de 2014

GraphViz + Django 1.6.1 + OSX

GraphViz es una herramienta muy útil para generar automáticamente diagramas UML de las clases que se tienen en un proyecto, anteriormente había hecho una entrada relacionada con dicha herramienta sin embargo se ha actualizado y ahora son menos pasos:

PASO 0 Instalar django-extensions

$ sudo easy_install django-extensions

PASO 1 Instalar GraphViz

Puedes descargarlo desde aquí: http://www.graphviz.org/Download_macos.php

PASO 2 Instalar el pygraphviz

$ sudo pip install pygraphviz

PASO 3 Instalar herramientas adicionales:

$ sudo pip install pyparsing==1.5.7
$ sudo pip install pydot

PASO 4 Modificar el archivo settings.py añadiendo dentro de INSTALLED_APPS django_extensions:

INSTALLED_APPS = (
    'django.contrib.admin',
    ...
    'django_extensions',
)


USO

Con lo anterior ya tenemos instalada la herramienta podemos ver la ayuda de la siguiente forma:
$ python manage.py graph_models --help

Para generar rapidamente el diagrama en formato png:
./manage.py graph_models -a -g -o mi_proyecto.png


Saludos y espero te sea de utilidad !




lunes, 6 de enero de 2014

Instalar Django + MySQL + OSX Guía Rápida (5 Pasos Generales)

Esta es una guía rápida que utilizo para desarrollar proyectos con Django:

PASO 0 Instalando herramientas de desarrollo 

Deberás tener MySQL instalado, debido a los cambios que generalmente existen una opción es entrando en el siguiente link (Ojo es importante que lo manejes todo con 64bit o 32bit, te recomiendo todo lo que instalemos en 64bits):
http://dev.mysql.com/downloads/mysql/

Si ya tienes instalado virtualenv no necesitas realizar este bloque de comandos 

$ sudo easy_install -U distribute 
$ sudo easy_install pip
$ sudo pip install virtualenv

Instalar librería para enlace de Python con MySQL compatible con Django


NOTA: Como prerequisito instale: wget.

Descargar el mejor instalador para mac y ponerlo a funcionar, aquí la info: 
http://brew.sh



PASO 1 Inicializando Proyecto

Crear el directorio:
$ mkdir miproyecto
$ cd miproyecto

Instalando utilizando una maquina virtual
$ virtualenv vmiproyecto
$ source vmiproyecto/bin/activate

Instalar django en la maquina virtual 
(vmiproyecto) $ sudo pip install django

Conexión de MySQL-Python 
(vmiproyecto) $ sudo brew install mysql    # Instala también libmysqlclient-dev
(vmiproyecto) $ sudo pip install mysql-python

Crear proyecto
(vmiproyecto) $ django-admin.py startproject miproyecto

Probar instalación:
(vmiproyecto) $ cd miproyecto
(vmiproyecto) $ python manage.py runserver

Entrar al navegador y probar con http://127.0.0.1:8000

PASO 3 Trabajando con git

Dentro de nuestro proyecto vamos a inicializar el sitio con el siguiente comando:
(vmiproyecto) $ git init

Antes de cualquier cosa le diremos a git que no debe trackear el archivo settings_local.py, que contendrá la configuración necesaria para la conectividad local, así como también los archivos *.swp ya que utilizó vim como editor; para esto debemos editar el archivo .gitignore, el cuál se debe crear si no existe y colocar dentro, el siguiente contenido (Puede usar $ vi .gitignore): 
settings_local.py
*.swp
*.pyc

Una vez realizado lo anterior utilizaremos la siguientes instrucciones para añadir a nuestro primer commit los archivos del proyecto:
(vmiproyecto) $ git add .
(vmiproyecto) $ git commit -m "Inicializando proyecto: miproyecto"

NOTA: Es recomendable utilizar algún sitio como github o bitbucket para llevar el control de versiones respaldando el código en un lugar externo, así como también el uso de diversas ramas según sea necesario.

PASO 4 Generando settings_local.py

Este archivo será diferente en el entorno de producción y en el entorno de desarrollo fue por eso que se agrego al .gitignore. Para lo anterior debemos crear el archivo settings_local.py con el siguiente contenido:

DATABASES_LOCAL = {
    'default': {
        'ENGINE': 'mysql.connector.django',
        'NAME': 'basededatos',
        'USER': 'usuario_basededatos',
        'PASSWORD': 'clave_usuario_basededatos',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }

}

PASO 5 Modificando la configuración del settings.py

#Esta instrucción sirve para cerrar la sesión una vez cerrado el navegador:
SESSION_EXPIRE_AT_BROWSER_CLOSE=True
...
#En el archivo settings.py eliminar la variable DATABASES = ... y dejar lo siguiente:
import settings.local.py
DATABASES = DATABASES_LOCAL
...
#Elegir el lenguaje del sistema en el ejemplo vemos español-México:
LANGUAGE_CODE=’es-MX’
...
#En caso de usar las zonas seleccionar la zona correcta desde: 
#http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
TIME_ZONE='America/Mexico_City'
...
#Desactivar Time Zone en ocasiones guarda la fecha y hora de acuerdo a 
#la zona horaria configurada, a menos que lo necesites puedes dejarlo
#activado, en mi caso particular no lo requiero.
USE_TZ=False


Referencias:
https://dl.dropboxusercontent.com/u/43970274/websites/desarrolloweb/index.html#settings
http://stackoverflow.com/questions/7335853/mysql-python-installation-problems-on-mac-os-x-lion
http://dev.mysql.com/doc/refman/5.0/es/resetting-permissions.html







miércoles, 2 de octubre de 2013

Django Implementación (Deployment) Ubuntu + NGINX + uWSGI + MySQL en 10 pasos (Actualizado)

Bien ya me toco instalar django sobre apache, pero mucha gente me ha referido a nginx como un gran servidor para equipos con bajos recursos ( quiero ponerlo dentro de una maquina virtual -_- ), que pueden levantar con mayor velocidad, así que me dispuse a probarlo dentro de una maquina virtual aquí el procedimiento:


PASO 1

Instalar el Ubuntu, en este caso no hubo mayor problema descargue virtualbox versión 4.2.18 y la versión de ubuntu 12.04.3 LTS. Te recomiendo que durante el proceso de instalación cuando te pregunte por instalar un servidor Open SSH, si lo actives, te será más facil lo siguiente realizando una conexión ssh (Sobre todo si estas utilizando un maquina virtual).


PASO 2

Como siguiente paso instalaremos mysql usando las instrucciones:
$ sudo apt-get upgrade
$ sudo apt-get install mysql-server

NOTA: Ojo con el password que se requerirá posteriormente. Que bonito funciona ubuntu todo con línea de comandos y casi sin problema :) ...


PASO 3

Ahora instalamos pip ( Generalmente python ya viene instalado por defecto a menos que desees otra instalación de python ) para instalarlo usamos:
$ sudo apt-get install python-setuptools
$ mkdir setup 
$ cd setup
$ wget http://python-distribute.org/distribute_setup.py
$ sudo python distribute_setup.py
$ sudo easy_install pip

NOTA: Es increíble lo bien que funciona, todo desde el terminal si hay errores solo es buscar un poco en internet.


PASO 4

Instalar Django hacemos lo siguiente
$ sudo pip install Django


PASO 5

Ahora bien empezamos con el enlace mysql-python para eso debemos instalar la herramienta de mysqldb usando los siguientes comandos:

Ese comando actualiza las referencias.
$ sudo easy_install -U distribute 
$ sudo apt-get install libmysql++-dev
# Ese comando evita los errores relacionados a - gcc -
$ sudo apt-get install python-dev   
$ sudo apt-get install python-mysqldb


PASO 6

Copiamos o creamos nuestro proyecto:
$ django-admin.py startproyect mi_proyecto

NOTA: Esta guía es solo es para la implementación por lo que supongo que ya tienen algo desarrollado o bien pueden colocar dentro de alguna vista un Hola Mundo para realizar pruebas.


PASO 7

Empezamos ahora con la parte interesante, para instalar nginx seguimos con lo genial de ubuntu usando la línea de comandos:
$ sudo apt-get install nginx
$ sudo apt-get install build-essential python
# Este comando actualiza las referencias de pip.
$ sudo easy_install -U pip
# Este comando actualiza las referencias de uwsgi.
$ sudo easy_install -U uwsgi      
$ sudo pip install uwsgi

NOTA: La segunda herramienta se utiliza para el control de uwsgi, que es la que posibilita a django enlazar con nginx previamente había un fastcgi pero al parecer django esta por darlo de baja en la versión Django 1.7.


PASO 8

Necesitaremos crear el archivo ini que utilizará uwsgi para manejar nuestra aplicación, la ubicación del archivo puede ser dentro del directorio del proyecto, en mi caso generalmente lo pongo dentro de una carpeta que se llama deploy, y el nombre puede ser: mi_proyecto_uwsgi.ini y le añadimos el siguiente contenido:

[uwsgi]
     chdir = /ruta/a/tu/proyecto/ 
     module = mi_proyecto.wsgi
     master = true
     processes = 10
     socket  = /ruta/a/tu/proyecto/mi_proyecto.sock 
     chmod-socket  = 666
     vacuum  = true


PASO 9

Ahora necesitaremos indicarle a nginx donde buscar los datos del uwsgi para esto dentro del mismo directorio de deploy que tenemos dentro de nuestro proyecto creamos un archivo con nombre mi_proyecto_nginx.conf con el siguiente contenido:


upstream django{
        server unix:///ruta/a/tu/proyecto/mi_proyecto.sock;
}

server {
        listen   80;
     
        server_name mi_server;
        charset utf-8;

        # Max upload size
        client_max_body_size 10M;

        access_log /ruta/a/tu/proyecto/mi_proyecto.access.log;
        error_log /ruta/a/tu/proyecto/mi_proyecto.error.log;

        location /static {
                gzip_static on;
                alias /ruta/a/tu/proyecto/static/;
        }

        location / {
                include /etc/nginx/uwsgi_params;   # verificar la ruta en tu implementación
                uwsgi_pass django;
        }
}

NOTA IMPORTANTE:
Como lo hicimos con la configuración de uwsgi también es necesario indicarle esta configuración a nginx y de igual forma lo mejor es crear un enlace símbolico:

$ sudo ln -s  /ruta/a/tu/proyecto/deploy/mi_proyecto_nginx.conf   /etc/nginx/sites-enabled/ 


PASO 10

Hasta el paso anterior ya podriamos hacer algunas pruebas reiniciando el nginx ...
$ sudo /etc/init.d/nginx restart

... y corriendo el comando:
$ uwsgi --ini mi_proyecto.ini

Sin embargo lo que seguro vamos a necesitar, es que el servidor, cargue automáticamente el proyecto al iniciar el equipo, para esto necesitaremos los siguientes comandos:

# Creando el servicio
$ sudo vi /etc/rc.local

# Agregar la siguiente línea al archivo antes del exit 0 
/usr/bin/uwsgi --emperor /ruta/a/tu/proyecto/deploy/mi_proyecto_uwsgi.ini --uid mi_usuario --gid www-data --daemonize /ruta/a/tu/proyecto/mi_proyecto.uwsgi.log

NOTA: Se debe verificar la ubicación del archivo uwsgi.


Realizado lo anterior al reiniciar la maquina virtual o el servidor debería de cargarlo correctamente.

Espero te sea de utilidad !


Referencias y links consultados:
https://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html?highlight=django
http://uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.html#deploying-django
http://eth0.pro/post/1
http://www.ubuntu-es.org/node/172656#.UcDqY5WWRhY
https://www.digitalocean.com/community/articles/how-to-install-nginx-on-ubuntu-12-04-lts-precise-pangolin
http://www.howtogeek.com/howto/ubuntu/install-mysql-server-5-on-ubuntu/
https://gist.github.com/panuta/3075882
http://stackoverflow.com/questions/11094718/error-command-gcc-failed-with-exit-status-1-while-installing-eventlet
http://askubuntu.com/questions/157840/why-does-apt-get-fail-to-resolve-the-mirror
http://skuarch.blogspot.mx/2010/02/crear-un-servicio-en-ubuntu.html
http://stackoverflow.com/questions/11425106/python-pip-install-fails-invalid-command-egg-info

miércoles, 13 de febrero de 2013

Django Deployment mod wsgi Windows Apache y MySQL


Nota: Por el momento mi proceso lo realice utilizando las versiones de 32 bits, indicare datos adicionales de versiones en cada paso que haya utilizado.

PASO 1: Instalar MySQL (versión 5 de 32 bits)

Descargando el instalador desde el sitio de Oracle, es probable que sea necesario que se registren.

PASO 2: Instalar Python (versión 2.7 de 32 bits)

Es importante configurar las variables de entorno para que desde la consola en cualquier lugar podamos utilizar solo la palabra python para ejecutar.


PASO 3: Instalar Python-MySQLdb (32 bits)

Se puede probar si quedo instalado entrando en python y utilizando:
 >>> import MySQLdb
Si no hay errores quiere decir que vamos bien, en caso de que tengan problemas con la instalación de este módulo pueden seguir este post:
http://omaryahir.blogspot.mx/2012/10/python-y-mysql-en-os-x-mountain-lion.HTML


PASO 4: Instalar Django (versión 1.4.3 )

Se puede probar que funciona django entrando a Python y usando:
>>> import Django
Si no hay errores vamos bien :)


PASO 5: Instalar Apache (httpd-2.2.22-win32-x86-openssl-0.9.8t.msi)

Lo descargue de esta dirección:
http://apache.webxcreen.org//httpd/binaries/win32/
Una forma rápida de verificar que funciono es abrir en el navegador el sitio http://localhost, en mi caso lo instale en el puerto 80.


PASO 6: Descargar mod_wsgi (versión 3.3)

Se debe descargar del sitio http://code.google.com/p/modwsgi/

Obtendremos un archivo de extensión .so este archivo debemos copiarlo al directorio modules de nuestra instalación de Apache (En mi caso C:\Program Files (x86)\Apache Software Foundation\Apache2.2\modules).

Para mayor comodidad renombramos el archivo que probablemente se encuentre con este nombre: mod_wsgi-win32-ap22py27-3.3.so, lo cambiamos por mod_wsgi.so nada mas.
Ahora bien es importante elegir un directorio para nuestras aplicaciones mod_wsgi, en mi caso yo hice uno en C:\wsgi_app\


PASO 7: Cargar el modulo mod_wsgi

Para este proceso es necesario localizar el arhivo - httpd.conf - usualmente se encuentra dentro del directorio /conf/ de la instalación de Apache (En mi caso lo encontre en: C:\Program Files (x86)\Apache Group\Apache2\conf).

Una vez abierto con cualquier editor de textos en mi caso uso Sublime, localizar "LoadModule" al encontrar dicho texto nos daremos cuenta que es la instrucción que utiliza Apache para cargar sus módulos; agregaremos una instrucción similar al final de estas sentencias de LoadModule quedando de la siguiente forma:

----
LoadModule wsgi_module modules/mod_wsgi.so
----

NOTA: Es probable que necesites editar el archivo en otro lugar y luego copiarlo al directorio en caso de que tengas restringido la modificación de archivos en el directorio donde se instaló el Apache.


PASO 8: Agregando en el archivo httpd.conf el WSGIScriptAlias

Dentro del archivo que abrimos en el paso anterior - httpd.conf - localizaremos la palabra Directory después del bloque < Directory / >  agregaremos lo siguiente:

----
# Config mod_wsgi
WSGIScriptAlias /wsgi "C:/wsgi_app/wsgi_handler.py"
< Directory "C:/wsgi_app"  >
    AllowOverride None
    Options None
    Order deny,allow
    Allow from all

< / Directory >
----

Lo anterior quiere decir que accederemos a los sitios que coloquemos en el directorio que creamos utilizando por ejemplo: http://localhost/wsgi

Ahora probaremos si quedo instalado correctamente el wsgi, creamos el archivo: wsgi_handler.py con el siguiente contenido:

def application(environ, start_response):
    status = "200 OK"
    output = "Funciono !!!"
    response_headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))]
    start_response(status, response_headers)
    return [output]

Una vez realizado lo anterior debemos reiniciar nuestro servidor Apache, lo cual podemos realizarlo desde el Apache Monitor, Si al reiniciar no hubo errores estamos del otro lado... :D

Algunos errores que me pasaron a mi:
- Use la versión 2.0 de Apache en un principio y no quizó cargar el archivo: mod_wsgi.so
- Otro error que tuve es que no le cambie el nombre al archivo por lo que no lo encontraba.

Bien, si no hubo errores vamos al navegador y colocamos:
http://localhost/wsgi/
Si ves el mensaje que dice Funciono !!!, entonces que crees... Funciono :)


PASO 9: Ahora si poniendo nuestro proyecto de Django

Hasta el paso anterior tenemos un servidor que tiene activado mod_wsgi y puede ejecutar archivos de python. Entonces ahora para colocar nuestros proyectos de Django regresaremos al archivo httpd.conf y vamos agregar otro directorio:
----
# MiProyecto
WSGIScriptAlias / "c:/wsgi_app/miproyecto/miproyecto/wsgi.py"
WSGIPythonPath "c:/wsgi_app/miproyecto"
< Directory "c:/wsgi_app/miproyecto"   >
   < Files wsgi.py >

      Order deny,allow
      Allow from all
   </Files >

< /Directory  >
----

Hasta aquí es probable que el proyecto funcione correctamente pero tendremos el detalle con los archivos estáticos por lo que agregamos lo siguiente:

----
Alias /static/ "c:/wsgi_app/miproyecto/static/"
----

#### ACTUALIZACION 15 FEB 2013
Me di cuenta de que si no se tienen los permisos correctos no se cargaran los archivos estáticos, por lo que se deben tener los permisos necesarios y además modificar el archivo httpd.conf quedando de la siguiente forma:

----
Alias /static/ "c:/wsgi_app/miproyecto/static/"
< Directory "C:/wsgi_app/miproyecto/static/"   >
      SetHandler None
      Order allow,deny
      Allow from all

< /Directory  >
----




Guardamos y reiniciamos.

Con lo anterior todo debe funcionar ya nadamas recuerda cambiar la variable DEBUG = False en el archivo settings.py


Casi lo olvido:El Administrador de Django tiene sus propios archivos estaticos y los busca en "/static/admin/" por lo que de acuerdo a lo que nos recomiendan en el sitio de Django:

"We strongly recommend using django.contrib.staticfiles to handle the admin files"

Una de las sugerencias es copiar los archivos a nuestro directorio por lo que en mi caso lo que hice fue copiar de:

"C:/Python27/Lib/site-packages/django/contrib/admin/static/admin/"

Al directorio donde tengo mis archivos estaticos:

"c:/wsgi_app/miproyecto/static/"

Con lo anterior el sitio de administración debe tomar los archivos estaticos.




Espero te sea de utilidad !




Referencias:
http://stackoverflow.com/questions/3777678/apache-mod-wsgi-django-setup-forbidden-you-dont-have-permission-to-access-my
http://pradyumnajoshi.wordpress.com/2009/06/09/setting-up-mod_wsgi-for-apache-and-django-on-windows/
https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/modwsgi/
https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/