<jupyter_start><jupyter_text>[![imagenes/pythonista.png](imagenes/pythonista.png)](https://pythonista.io)  Introducción a Django. [*Django*](https://www.djangoproject.com/) es el marco de trabajo (framework) para desarrollo de aplicaciones web basado en Python de mayor popularidad y uno de los más [populares en general](https://hotframeworks.com/).Su lema es: "El framework web para perfeccionistas con plazos de entrega".A diferencia de microframeworks como [*Flask*](http://flask.pocoo.org/), *Django* viene con una basta cantidad de módulos y funcionalidades disponibles desde la instalación.Entre otras cosas, *Django* cuenta con las siguientes funcionalidades:* Instalación y configuración sencilla y rápida.* Cuenta con un *ORM* (Object Relational Mapper) avanzado.* Utiliza plantillas (templates) para desplegar aplicaciones.* Soporta múltipes idiomas.* Diseñado para aprovechar el paradigma de desarrollo dirigido por pruebas (*TDD*).* Se apega al patrón [*MVC*](https://es.wikipedia.org/wiki/Modelo%E2%80%93vista%E2%80%93controlador) mediante la implementación del concepto  "Model View Template".* Hace énfasis en la seguridad.* Es escalable.* Es muy versátil, ya que es una excelente plataforma para:    * Desarrollar aplicaciones web.    * Desarrollar API web.    * Desarrollo de aplicaciones móviles.La [documentación](https://docs.djangoproject.com/) del proyecto es extensa y aún cuando el idioma por defecto es el inglés, gran parte de ella está en [español](https://docs.djangoproject.com/es/2.1/).  Instalación.*Django* puede ser instalado con ```pip``` desde su repositorio en https://pypi.org/project/Django/. **Ejemplo:**La siguiente celda instalará la versión más reciente de *Django*.**Nota:** En caso de utilizar esta notebook en un entorno distinto al del la máquina virtual de Pythonista®, tome en cuenta que debe de contar con ```pip``` instalado y con los permisos necesarios para instalar el paquete correspondiente.<jupyter_code>!pip install django<jupyter_output><empty_output><jupyter_text>Proyectos (projects) y aplicaciones (apps) de *Django*.Al desarrollar aplicaciones web en *Django* se entiende lo siguiente:* Un proyecto se refiere a un producto completo que será desplegado por el framework. Por lo general un proyecto corresponde a un sitio web.* Una aplicación es un componente autocontenido de un proyecto y por lo general corresponde a una URL dentro del sitio.  El comando ```django-admin```.Este comando es el encargado de la administración general de los proyectos basados en *Django* y es instalado de forma automática cuando se instala el paquete.La sintaxis de uso del comando es la siguiente al ejecutarse desde una terminal.```django-admin  ```Donde:* `````` corresponde a una instrucción específica.* `````` corersponde a una secuencia de valores específicos. **Ejemplo:** * La siguiente celda despelgará la localización donde se encuentra ```django-admin```. **Nota:** El comando ```which``` es propio de sistemas basados en GNU/Linux. En caso de que se ejecute el siguiente comando en un entorno distinto al de la VM proporcionada por Pythonista®, es posible que tenga que instalarlo. En otros sistemas no es posible ejecutar este comando.<jupyter_code>!which django-admin<jupyter_output><empty_output><jupyter_text>* La siguiente celda despelgará la función de ayuda de ```django-admin```.<jupyter_code>!django-admin help
!django-admin help startproject<jupyter_output><empty_output><jupyter_text>Despliegue de la estructura inicial de un proyecto.El comando ```django-admin startproject``` creará la estructura inicial de un proyecto, usando la siguiente sintaxis:```django-admin startproject ```Donde:* `````` corresponde al nombre del proyecto y cuya estructura será creada dentro de un subdirectorio del mismo nombre. **Ejemplo:** * La siguiente celda realizará lo siguiente:   * Creará el subdirectorio ```tutorial``` en el directorio en el que se encuentra actualmente esta notebook.   * Desplegará la estructura mínima de archivos y de subdirectorios de un proyecto de Django.<jupyter_code>!django-admin startproject tutorial<jupyter_output><empty_output><jupyter_text>La estructura por defecto de un proyecto de Django.A continuación se mostrará la estructura creada dentro del subdirectorio [```tutorial```](tutorial). * La estructura resultante sería algo similar a lo siguiente:```tutorial├── manage.py└── tutorial    ├── __init__.py    ├── settings.py    ├── urls.py    └── wsgi.py```* Se puede apreciar que en el directorio ```tutorial``` se encuentran:    * El script ```manage.py```    * Otro subdirectorio de nombre ```tutorial``` con la estructura de un paquete de Python.  El script ```manage.py```. Este script hace uso de forma indirecta de ```django-admin``` para la gestión de un proyecto en particular con cualquiera de la siguientes sintaxis.```./manage.py  ```o```python manage.py  ```Donde:* `````` corresponde a una instrucción específica.* `````` corersponde a una secuencia de valores específicos.**Nota:** Es necesario ejecutar el script ```manage.py``` desde el directorio en el que dicho script se encuentra. A partir de este momento se dará por hecho lo anterior. * La siguiente celda moverá la ejecución de la notebook al directorio ```tutorial```.<jupyter_code>%cd tutorial<jupyter_output><empty_output><jupyter_text>* La siguiente celda desplegará el contenido del script ```manage.py```.<jupyter_code>%pycat manage.py<jupyter_output><empty_output><jupyter_text>**Ejemplo:** * En vista de que el directorio de ejecución de esta notebook fue cambiado al subdirectorio ```tutorial```, se ejecutará el script ```manage.py``` de la forma siguiente:<jupyter_code>!python manage.py help<jupyter_output><empty_output><jupyter_text>Creación de una aplicación.Para crear una aplicación se utiliza el siguiente comando especificando el directorio en el que se encontrará la aplicación dentro del directorio del proyecto.```./manage.py startapp ```o```python manage.py startapp ```Donde:* `````` corresponde al nombre de la aplicación y cuya estructura será creada dentro de un subdirectorio del mismo nombre. **Ejemplo:** * La siguiente celda creará el sistema de archivos de una aplicación localizada en un nuevo subdirectorio llamado ```main``` en el directorio ```prueba```.<jupyter_code>!python manage.py startapp main<jupyter_output><empty_output><jupyter_text>La estructura de archivos del directorio ```tutorial``` resultante sería algo similar a lo siguiente:```tutorial/├── main│   ├── admin.py│   ├── apps.py│   ├── __init__.py│   ├── migrations│   │   └── __init__.py│   ├── models.py│   ├── tests.py│   └── views.py├── manage.py└── tutorial    ├── __init__.py    ├── settings.py    ├── urls.py    └── wsgi.py```  Arranque  del servidor de aplicaciones de  un proyecto.```./manage.py runserver :```o```python manage.py runserver :```Donde:* `````` corresponde a una máscara IP, un dominio o un host que serán las direcciones autorizadas para acceder al servidor de *Django*. * `````` corresponde al número de puerto desde el cual será accesible el servidor de *Django*.**Notas:*** Si no se especifica el rango de transmisión, el servidor de *Django* sólo será accesible para ```localhost```.* Si no se especifica el puerto, el servidor de *Django* estará disponible en el puerto ```8000```.* Para que el servidor de *Django* esté disponible para todas las direcciones IP, se definirá el rango de transmisión ```0.0.0.0```.  Arranque desde la *notebook*.En caso de usar una *notebook* desde una máquina virtual proporcionada por *Pythonista®*, es posible iniciar el servidor web de *Django* ejecutando las siguientes celdas.<jupyter_code>%cd tutorial
python manage.py runserver 0.0.0.0:8000<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10422608244749805, 'fraction_numerical': 0.003629764065335753, 'mean_word_length': 5.554800339847069, 'pattern_counts': {'":': 0, '<': 37, '<?xml version=': 0, '>': 37, 'https://': 7, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 2, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '421636', 'license': 'MIT', 'n_tokens_mistral': 2480, 'n_tokens_neox': 2475, 'n_words': 918, 'path': '01_introduccion_a_django.ipynb', 'repo_name': 'rvalle71mx/PY201', 'size': '7714'}