Webmaster > Desarrollo Web

Ejemplo de prueba index.py para Django y MySQL con mod_wsgi

(1/5) > >>

shakaran:
Debido al reciente auge de cuentas que usan Django en nuestro servidor y algunas dudas que han ido enviadas al email de soporte, publicamos el código de un ejemplo base para mejor comprensión del funcionamiento y como punto de partida para nuevos usuarios.

Por defecto en los servidores de Quijost se utiliza mod_wsgi para servir páginas Python con Apache, anteriormente utilizábamos mod_python, pero debido a que no recibe actualizaciones de sus autores desde 2008 y esta desmantenido se producen varios errores con las nuevas versiones de Apache y es por este motivo por el que se utiliza mod_wsgi que es más eficiente y novedoso.

Paso 1: Crear un archivo index.py con el siguiente contenido de prueba:

--- Código: ---#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Add the project to the python path
import os, sys
sys.path.append('/home/usuarioquijost/public_html/mydjangoapp/')
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))

# Prevent mod_wsgi from erroring on stdout access (WSGIRestrictStdout Off)
sys.stdout = sys.stderr

os.environ['PYTHON_EGG_CACHE']       = '/home/usuarioquijost/tmp/trac-eggs/'
os.environ['DJANGO_SETTINGS_MODULE'] = 'mydjangoapp.settings'

import django.core.handlers.wsgi

application = django.core.handlers.wsgi.WSGIHandler()

# Debug middleware
if settings.DEBUG:
    print >> sys.stderr, "Using Paste error middleware"
    from paste.exceptions.errormiddleware import ErrorMiddleware
    application = ErrorMiddleware(application, debug=True, show_exceptions_in_wsgi_errors=True)

# Create session directory if not present
if settings.SESSION_FILE_PATH:
    try:
     os.makedirs(settings.SESSION_FILE_PATH)
    except OSError:
        pass

def application(environ, start_response):
   
    import sys
    output = 'Python version: ' + str(sys.version) + '<br/>'

    import django
    output += 'Django version: ' + str(django.VERSION) + '<br/>'
   
    status = '200 OK'
    response_headers = [('Content-type', 'text/html;charset=UTF-8'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]

--- Fin del código ---

Nota: Si usas MySQLdb o requieres de un directorio trac-eggs, en esta configuración básica no esta habilitado y te dara un error 500, lee al final del post, para conocer como configurarlo.

Paso 2: Para que el fichero sera interpretado por el servidor de mod_wsgi de Apache, es necesario definir un archivo .htaccess como por ejemplo el siguiente:

--- Código: ---SetHandler wsgi-script
DirectoryIndex index.py
--- Fin del código ---

Importante: NO usar la directiva "PythonHandler". Esta directiva es sólo para mod_python y no para mod_wsgi, por lo que su uso esta obsoleto y producirá un error 500 al no estar soportada en mod_wsgi.

Para ver este mismo ejemplo funcionando (algo más avanzado), visitad: http://quijost.com/sandbox/index.py

Paso 3:: Crear un proyecto Django

Es necesario crear un proyecto Django para ejecutar este ejemplo. Observa que en nuestro index.py estamos sobreescribiendo la aplicación "application" para mostrar siempre nuestro index.py (con la versión  de Python y Django). Para configurar un proyecto Django más avanzado con vistas y múltiples direcciones se debe usar la técnica del fichero dwsgi.py redireccionando con el .htaccess

El proyecto Django puede crearse en el pc local del usuario y subirse por FTP en caso de no disponer de acceso SSH (por ejemplo en planes efree). Sin embargo si dispones de acceso SSH (para planes ebasic y superiores) puedes acceder por ssh y utilizar el comando:


--- Código: ---cd ~/public_html/; django-admin.py startproject mydjangoapp
--- Fin del código ---

Esto creará un directorio mydjangoapp en public_html con el contenido del proyecto. Dentro de la carpeta mydjangoapp existirá otra carpeta mydjangoapp (la aplicación) con su fichero settings.py. Por ello previamente en el paso 1, hemos añadido la ruta (path) con la línea


--- Código: ---sys.path.append('/home/usuarioquijost/public_html/mydjangoapp/')
--- Fin del código ---

Gestión de errores

Primero te aconsejamos leer nuestro post Gestionar errores 500 con manejadores Django para entender la forma de gestión de errores en Django.

Si recibes un error 500, lo más probable es que Django este lanzando alguna excepción de ImproperlyConfigured, que se traduce como un error 500 que es registrado en el error_log general de Apache. Puesto que en servidores compartidos no puede concederse acceso regular al error_log general por motivos de seguridad, puedes optar por envolver tu código entre try/catch para capturar la excepción y conocer el mensaje de error que origina tu problema.

Por ejemplo:


--- Código: ---import traceback
filename = '/home/usuarioquijost/public_html/error_log.txt'
f = open(filename, 'w')
try:
  import django.core.handlers.wsgi
  application = django.core.handlers.wsgi.WSGIHandler()
  f.write('Ok')
except:
  traceback.print_exc(file=f) 
f.close()
--- Fin del código ---

Es importante recalcar que la ruta del archivo "filename" debe ser absoluta para evitar confusiones (y adaptarla al usuario propio de Quijost). Por ejemplo, si se establece como ruta sólo el nombre "error_log.txt" provocará un intento de registrar errores en "/error_log.txt" (la raíz del servidor, no la del directorio de usuario) y se obtendrá un Permission Denied ya que no existen permisos root.

Para establecer los permisos de escritura en el archivo de error_log.txt y evitar un error 500, ejecutar:


--- Código: ---chmod 777 /home/usuarioquijost/public_html/error_log.txt
--- Fin del código ---

También puede usar algunos manejadores (handlers) más avanzados para la depuración de errores: http://www.davidcramer.net/code/502/debugging-django-errors.html

Otra opción es redirigir la salida estandar de error de WSGI a un fichero de excepciones, con el que podras acceder a tus error_log generados.

Debes crear una clase para las excepciones. Puedes encontrar más información en este artículo (en inglés):
http://lucumr.pocoo.org/2007/5/21/getting-started-with-wsgi

Solución de errores 500 - Directorio trac-eggs

Uno de los errores más frecuentes es poner una ruta trac-eggs incorrecta. Esta ruta, debe estar en un directorio accesible por el usuario y con permisos de escritura.

Para ello puedes ponerla como:

--- Código: ---import os
os.environ['PYTHON_EGG_CACHE'] = '/home/USUARIO/tmp/trac-eggs'

--- Fin del código ---

Es importante que este directorio disponga de permisos de escritura para mod_wsgi, de lo contrario no podrá descomprimir los egg, por ejemplo de MySQL y resultará otro error 500 al arrojar una excepción de ExtractionError:


--- Código: ---ExtractionError: Can't extract file(s) to egg cache
 
 The following error occurred while trying to extract file(s) to the Python egg
 cache:
 
   [Errno 13] Permission denied: '/home/usuario/tmp/MySQL_python-1.2.3-py2.7-linux-x86_64.egg-tmp'

--- Fin del código ---

Si tienes algún problema adicional, no dudes en abrir un tema en el foro y te ayudaremos con el despliegue de tu aplicación. Te aconsejamos antes revisar algunos post de nuestro foro y faqs por si es  una duda previamente resuelta.

fiachett:
shakaran, cómo estás?. Estoy probando el ejemplo, pero no funciona ni el que hice yo, ni  http://quijost.com/sandbox/index.py

El error que sale es el siguiente:

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, webmaster@fiachett.quijost.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.


Muchas gracias

shakaran:
Gracias por aviso. Parece ser que con la migración el modulo de mysql no estaba recompilado para python y ese era el error, ahora ya carga la página de ejemplo y debería cargar la tuya a menos que tengas algun error (te aconsejo mirar los error_log de tu cuenta para ver posibles errores).

Dejanos saber si aún sigues teniendo problemas.

impulse:
Hola, estoy intentando ejecutar el script como has explicado en este hilo, pero recibo un error 500.

Lo estoy intentando probar en www.josejimenez.net/prueba/index.py

Por otra parte, he visto que en mi home tengo un enlace al fichero access.log de Apache. Habría posibilidad de tener otro enlace al fichero error.log?

Gracias.

shakaran:
Hola, el fichero error_log de apache es general de todo el server, con información sensible de todos los usuarios y no puedo darte acceso al mismo (unicamente si tuvieras tu propio VPS podrías gestionarlo). Pero en realidad no te hace falta acceso al mismo. ya que lo unico que necesitas es redirigir la salida estandar de error de WSGI a un fichero de excepciones y evitar el error 500.

Para ello simplemente debes crear una clase para las excepciones. Puedes encontrar más información en este artículo (en inglés):
http://lucumr.pocoo.org/2007/5/21/getting-started-with-wsgi

Otro artículo util podría ser (en inglés): http://www.davidcramer.net/code/502/debugging-django-errors.html

Nuestro post, es un ejemplo básico sin gestión de excepciones, por eso se escribe alguna línea mal, fallará dando un error 500 al no tener manejador de excepciones implementado.

En tu caso aparece lo siguiente en el error_log:


--- Código: ---[Wed Sep 01 12:04:46 2010] [error] [client 83.*.*.*] mod_wsgi (pid=31878): Exception occurred processing WSGI script '/home/josejime/public_html/prueba/index.py'.
[Wed Sep 01 12:04:46 2010] [error] [client 83.*.*.*] Traceback (most recent call last):
[Wed Sep 01 12:04:46 2010] [error] [client 83.*.*.*]   File "/home/josejime/public_html/prueba/index.py", line 10, in application
[Wed Sep 01 12:04:46 2010] [error] [client 83.*.*.*]     output += 'Python version: ' + str(sys.version) + '<br/>'
[Wed Sep 01 12:04:46 2010] [error] [client 83.*.*.*] UnboundLocalError: local variable 'output' referenced before assignment

--- Fin del código ---

Parece todo indica a que parece ser que no has declarado la variable output.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa