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:
#!/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]
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:
SetHandler wsgi-script
DirectoryIndex index.py
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.pyPaso 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:
cd ~/public_html/; django-admin.py startproject mydjangoapp
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
sys.path.append('/home/usuarioquijost/public_html/mydjangoapp/')
Gestión de erroresPrimero 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:
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()
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:
chmod 777 /home/usuarioquijost/public_html/error_log.txt
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.htmlOtra 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-wsgiSolución de errores 500 - Directorio trac-eggsUno 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:
import os
os.environ['PYTHON_EGG_CACHE'] = '/home/USUARIO/tmp/trac-eggs'
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:
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'
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.