Instalación de Django en IIS: un tutorial paso a paso
Publicado: 2022-03-11Aunque muchos desarrolladores de Django pueden considerarlo una blasfemia, a veces es realmente necesario implementar aplicaciones de Django en Windows/IIS, especialmente cuando se trabaja con un cliente que ha basado su infraestructura en el ecosistema de Windows. La parte de la "blasfemia" proviene de que Django realmente se centró en el entorno Unix, confiando en gran medida en características como WSGI, FastCGI y herramientas de línea de comandos, todas las cuales son ajenas a Windows. Afortunadamente, la compatibilidad con Django/IIS está mejorando, gracias a la adición de funciones (que de otro modo serían una chapuza) en los lados de la ecuación de Windows y Python+Django, lo que ayuda a resolver los problemas de compatibilidad entre estos dos mundos técnicos dispares.
Este tutorial breve y enfocado lo guía a través de la configuración básica de un proyecto Django en Windows. Cubre la instalación de Python, Django y herramientas relacionadas, incluida la ejecución del proyecto Django tanto de forma independiente como como un servidor FastCGI. Este último es cada vez más importante, por cierto, ya que IIS ahora admite oficialmente FastCGI (en IIS 7+, simplemente instale la función CGI).
Nota: este tutorial está destinado a aquellos que tienen un conocimiento práctico de Windows y que están familiarizados con la consola de administración de IIS. La versión de IIS utilizada en este tutorial es la 8.5, pero las descripciones y técnicas son similares a las de versiones anteriores. El tutorial está basado en Python 2.7 y Django 1.7, ya que esas son las versiones que uso para mis proyectos. Puedes encontrar otro tutorial de Django aquí.
Consejo profesional: si va a implementar varios proyectos de Django (o incluso de Python simple), o si es un desarrollador, debe consultar virtualenv, una herramienta para crear entornos aislados de Python.
Instalación de Python en Windows
Primero, descarga Python. Se proporcionan instaladores MSI de 32 bits y 64 bits, y debe elegir el apropiado para la máquina en la que está instalando.
PIP es la herramienta que instala y mantiene las bibliotecas de Python (de las cuales Django es solo un ejemplo). Se invoca ejecutando el comando pip en el símbolo del sistema. Implementa varios subcomandos, y dos de los más útiles son install y freeze . PIP también instalará las dependencias del proyecto (bibliotecas adicionales), si el proyecto tiene alguna.
Ejecutar pip install <package_name> descargará e instalará el paquete y todas sus dependencias (que pueden estar anidadas y ser bastante complejas). Ejecutar pip install --upgrade <package_name> también actualizará un paquete existente a su versión más reciente. PIP admite una sintaxis especial para instalar versiones precisas de un paquete en lugar de solo "la más reciente". Se realiza agregando un operador y un número de versión al nombre del paquete; por ejemplo, "Jinja2==2.7.3" (para instalar una versión precisa) o "six>=1.8" (para instalar cualquier versión igual o superior al número de versión especificado).
Ejecutar pip freeze simplemente muestra la lista de paquetes actualmente instalados en un formato que pip install puede usar directamente.
Tenga en cuenta que algunos paquetes de Python/PIP vienen con bibliotecas escritas en C, que deben compilarse para que el paquete funcione. A menos que configure su sistema para tener un compilador de C en funcionamiento que también sea compatible con los ejecutables de Python, no podrá instalar dichos paquetes. Django es una biblioteca de Python pura, por lo que no requiere un compilador de C para instalar.
Es importante que instale Python 2.7.9 o posterior, ya que las versiones de Python que comienzan con 2.7.9 incluyen PIP, la biblioteca/paquete/administrador de software de Python que se usa para instalar todo lo demás en este tutorial.
El proceso de instalación es muy directo y simple. Ofrecerá instalar Python en el directorio C:\Python27
, que debe aceptar ya que le facilita la vida después. Trate de no ceder al hábito de Windows de instalar cosas en directorios con espacios en sus nombres.
El directorio básico después de la instalación contendrá alrededor de 8 subdirectorios, algunos archivos diversos y dos ejecutables llamados Python.exe
y PythonW.exe
. El primero es el intérprete de línea de comandos predeterminado y el shell de Python, mientras que el segundo es solo el intérprete, que no usará (ni generará) una ventana de consola si se invoca, y debido a esto es adecuado para ejecutar aplicaciones GUI de Python.
A continuación, se debe agregar Python a la variable de entorno PATH del sistema. Esto se hace en Configuración avanzada del sistema (o Propiedades del sistema ), en la pestaña Avanzado , haciendo clic en el botón Variables de entorno . Se agregarán dos directorios: C:\Python27
y C:\Python27\Scripts
. Estos deben agregarse a la lista PATH, separados por punto y coma ( ;
). El final de su variable PATH debería verse como ;C:\Python27;C:\Python27\Scripts
.
Consejo profesional: es posible que también desee instalar GOW, una colección liviana de utilidades de línea de comandos de Unix similar a Cygwin. Te proporcionará herramientas como
ls
, pero también otras más interesantes comomake
,wget
,curl
,ssh
,scp
,gzip
ytar
.
Instalación de Django en Windows
Django se puede instalar usando PIP con un comando como pip install django
. El proceso puede generar algunas dependencias adicionales si aún no están presentes en su sistema. De lo contrario, simplemente instalará solo Django, con un resultado similar al siguiente:
Downloading/unpacking django Installing collected packages: django Successfully installed django Cleaning up...
Puede verificar si tanto Python como Django para Windows funcionan iniciando un nuevo símbolo del sistema de Windows, ejecutando el comando python
e ingresando el comando import django
en el indicador de Python. Si funciona correctamente, no debería haber resultados ni mensajes después del comando import django
; es decir:
Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import django >>>
Instalación de un proyecto Django en Windows
Un “proyecto” de Django consta de una o más “aplicaciones”. El directorio de nivel superior de un proyecto generalmente contiene un subdirectorio de proyecto especial que contiene configuraciones y cierta información general a nivel de proyecto, un subdirectorio por aplicación y un script de línea de comandos llamado manage.py
. Por ejemplo:
C:\Devel\djangoproject\src>dir Volume in drive C is OS Volume Serial Number is 6A3D-C1B8 Directory of C:\Devel\djangoproject\src 22/12/2014 04:25 <DIR> . 22/12/2014 04:25 <DIR> .. 22/12/2014 04:19 <DIR> project 22/12/2014 04:58 <DIR> djangoapp 16/12/2014 03:30 <DIR> templates 16/12/2014 00:50 250 manage.py 1 File(s) 250 bytes 5 Dir(s) 23,552,929,792 bytes free
Los proyectos de Django se pueden distribuir simplemente archivando todo el directorio del proyecto y descomprimiéndolo en otra máquina. En el ejemplo anterior, el proyecto contiene el subdirectorio del project
, el directorio de la aplicación llamado djangoapp
y un subdirectorio de templates
auxiliares.
El script manage.py
es la “navaja suiza” de las aplicaciones Django. Hace de todo, desde crear nuevas aplicaciones hasta migraciones de bases de datos, ejecutar un servidor HTTP de prueba (incrustado) o incluso un servidor FastCGI.
Ejecutar un servidor HTTP de prueba
Si el proyecto y sus aplicaciones son funcionales, debería poder iniciar el servidor HTTP predeterminado solo para desarrollo de Django ejecutando el comando manage.py runserver
, que debería dar como resultado un resultado similar al siguiente:
C:\Devel\djangoproject\src>manage.py runserver Performing system checks... System check identified no issues (0 silenced). December 23, 2014 - 01:19:02 Django version 1.7.1, using settings 'project.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK.
Como puede ver en los mensajes, esto inicia un servidor en localhost, puerto 8000. Puede acceder a él inmediatamente con su navegador web.
Configuración y ejecución de un servidor FastCGI
Una opción más interesante es habilitar un servidor FastCGI. Con FastCGI, puede usar IIS, Apache o cualquier otro servidor web para servir la aplicación en una configuración de producción. Para que esto funcione, debe descargar fcgi.py (el comando de administración de Django para ejecutar Django en Windows con IIS a través de FastCGI) y colocarlo en el subdirectorio de management/commands
del subdirectorio de la aplicación Django (¡no del proyecto!). Tanto los subdirectorios de management
como los de commands
deben tener un archivo vacío llamado __init__.py
(que convierte esos directorios en módulos de Python).

fcgi.py
es un adaptador de WSGI a FastCGI muy simple y minimalista que no admite la escucha en un socket TCP o una tubería, y realiza todo su procesamiento utilizando stdin
y stdout`. Como tal, no se puede usar con servidores web modernos como nginx, pero funcionará con IIS.
Configuración de IIS para ejecutar una aplicación FastCGI
Si el módulo FastCGI está cargado en IIS (o simplemente el módulo CGI en IIS 7+), la consola de administración de IIS tendrá disponible el ícono "Configuración de FastCGI". Django es un marco que tiene su propio enrutamiento de URL, por lo que las aplicaciones de Django deben instalarse como un "controlador" en IIS para rutas específicas. Para instalar una aplicación Django en el sitio web predeterminado de IIS, selecciónela en la consola de administración y abra la función de configuración de asignaciones de controladores. En él, haga clic en la acción Add Module Mapping… e ingrese la siguiente información:
- Ruta de solicitud : configúrelo en
\*
para manejar todas las solicitudes con enrutamiento interno de Django - Módulo : Establézcalo en
FastCgiModule
para usar el módulo FastCGI de IIS - Ejecutable : aquí, tanto la ruta de
python.exe
como los argumentos de la línea de comando deben establecerse, utilizando el carácter de barra vertical (|
) como separador. Un valor de ejemplo para esta configuración es:C:\Python27\python.exe|C:\app\src\manage.py fcgi --pythonpath C:\app\src --settings project.settings
. Tenga en cuenta que debe especificar el comandofcgi
para el scriptmanage.py
y configurar manualmente la ruta de búsqueda del intérprete de Python para el proyecto, así como el nombre del módulo de Python para el módulo de configuración del proyecto. - Nombre : Puedes configurar esto como quieras.
Su diálogo de configuración debería verse así:
A continuación, haga clic en el botón Solicitar restricciones y edite la pestaña Asignación . Desmarque la casilla de verificación "Invocar controlador solo si la solicitud está asignada a..." (de lo contrario, IIS tendrá problemas para asignar lo que cree que son subdirectorios en la solicitud de URL):
Haga clic en Aceptar en el cuadro de diálogo de información del controlador. IIS le pedirá que confirme la creación de una entrada de aplicación FastCGI coincidente que deberá confirmar. Esta entrada será visible en la función Configuración de FastCGI , accesible en la pantalla raíz de la consola de administración de IIS. La entrada predeterminada creada por el propio IIS es adecuada, pero hay algunas configuraciones opcionales disponibles que quizás desee aprovechar:
- Instancias máximas : el enfoque que estamos empleando para ejecutar aplicaciones FastCGI es un proceso único, un subproceso único, lo que significa que se iniciará un proceso de interpretación de Python independiente para cada solicitud simultánea . Esta configuración limita la cantidad de instancias simultáneas de la aplicación Django.
- Supervisar los cambios en el archivo : de forma predeterminada, una vez iniciados, los procesos de la aplicación estarán activos hasta que se apaguen manualmente o hasta que manejen las solicitudes de Instancia MaxRequest . Al usar esta configuración, IIS monitoreará una marca de tiempo de un archivo arbitrario y, si cambia, detendrá y volverá a cargar las instancias de la aplicación. Esto es conveniente tanto para los desarrolladores como para los entornos de producción, ya que permite que las aplicaciones se vuelvan a cargar cuando se modifican. El "supervisar la marca de tiempo de un archivo para un indicador de recarga" es un concepto bastante extraño en Windows, pero es normal en entornos similares a Unix, por lo que se trasladó aquí con FastCGI.
Configuración de los directorios de medios y recursos estáticos
Las aplicaciones web modernas utilizan varios archivos de recursos, como CSS, JavaScript y otros, y las aplicaciones de Django no son una excepción. Django proporciona una característica muy conveniente que permite a los desarrolladores integrar los recursos necesarios en el árbol de directorios de la aplicación, pero que Django puede extraer y copiar en un directorio estático adecuado. Esta es básicamente una función controlada por el desarrollador, y las ubicaciones donde Django almacenará los archivos estáticos se controlan en la settings.py
del proyecto.py. Los proyectos que se comportan bien utilizarán un camino razonablemente sensato para esto, pero no está estandarizado.
Las aplicaciones que manejan archivos cargados los almacenan en un directorio administrado de manera similar que, en Django, se llama tradicionalmente media
. Los directorios static
y de media
deben agregarse a la configuración de IIS como directorios virtuales:
El paso importante aquí es reconfigurar la función de StaticFile
como el más importante.
Tenga en cuenta que IIS debe poder leer el directorio static
(así como todos los demás archivos y directorios del proyecto Django), pero IIS también debe poder escribir en el directorio media
. La configuración final del sitio debe parecerse a la siguiente:
Una nota sobre las bases de datos.
SQLite funciona de forma predeterminada en Windows, al igual que en sistemas similares a Unix. La mayoría de las otras bases de datos de código abierto ahora funcionan en Windows, incluso PostgreSQL, que recomiendo. Sin embargo, en las instalaciones de Windows existentes, podría haber un requisito para implementar Django con MS SQL Server. Esto es posible mediante el uso de un controlador de puente ODBC o mediante un controlador MS SQL nativo. En teoría, ambos funcionan, pero no los he probado. Al menos los parámetros de conexión de la base de datos (en el archivo settings.py
del proyecto) deben cambiarse para cambiar a una nueva base de datos. La migración de datos debe realizarse manualmente.
Tenga en cuenta que si utiliza la base de datos SQLite, tanto el archivo de la base de datos como el directorio donde se encuentra deben poder ser escritos por IIS.
Solución de problemas
La configuración descrita está probada y se ha comprobado que funciona, pero si algo sale mal, aquí hay algunos pasos básicos para solucionar los problemas de su instalación de Django para Windows:
- Intente iniciar la línea de comando FastCGI usted mismo. Este es el comando configurado en FastCGI Settings y que debe coincidir con el configurado en Handler Mappings para el sitio.
- Instale la función de seguimiento para IIS, luego configúrela para el sitio de Django en Reglas de seguimiento de solicitudes fallidas para rastrear todo el contenido ( ), el código de estado "500" y la gravedad del evento "Error". Los seguimientos estarán disponibles como archivos XML (con XSLT adjunto) en el directorio
C:\inetpub\logs\FailedReqLogFiles
de IIS (o uno similar, según su configuración). Luego debe habilitar el rastreo para el sitio web en particular (o un directorio virtual) en la acción *Configurar->Rastreo de solicitud fallida… .
Conclusión
Sin duda, Django está diseñado para un entorno similar a Unix, y la forma más extendida y compatible de ejecutar Django es en un sistema Linux (por ejemplo, con uwsgi y nginx).
Sin embargo, no se necesita mucho trabajo para hacer que Django se ejecute en Windows, como se muestra en este tutorial. Algunos de los pasos descritos pueden parecer contrarios a la intuición desde una perspectiva puramente de Windows, pero son necesarios y, afortunadamente, el esfuerzo dedicado a la configuración es solo una vez. Una vez configurada, la aplicación Django debería comportarse de la misma manera que lo haría en una plataforma Linux.