Desmitificando la Magia de Django

Publicado: 2022-03-10
Resumen rápido ↬ En este artículo, analizaremos en profundidad lo que Django trae a la mesa al comprender qué hacen los archivos y carpetas generados, esto nos dará una mejor comprensión del marco de trabajo de Django.

Según la documentación oficial,

Django es un marco web Python de alto nivel que fomenta un desarrollo rápido y un diseño limpio y pragmático. Creado por desarrolladores experimentados, se ocupa de gran parte de las molestias del desarrollo web, por lo que puede concentrarse en escribir su aplicación sin necesidad de reinventar la rueda. Es gratis y de código abierto.

— DjangoProject.com

Es uno de los marcos populares de Python para crear aplicaciones web y es el más preferido por su escalabilidad en la creación de un modelo con configuraciones y archivos establecidos. Esto resume todo el objetivo de Django para los desarrolladores;

"... crear una gran aplicación en poco tiempo y menos preocupaciones sobre la configuración básica".

Hay configuraciones básicas, archivos y estilos que se aplican a todas las aplicaciones web, sin importar lo que esté creando. Cuando usa Django, estos se generan automáticamente cuando ejecuta ciertos comandos en diferentes puntos del ciclo de desarrollo de su aplicación. Con esto, tendrás suficiente tiempo para concentrarte en el aspecto central del desarrollo de tu aplicación mientras Django maneja los demás por ti.

Significa que hay muchas cosas sucediendo debajo del capó. Para alguien que no tiene un conocimiento completo de las partes móviles, esto puede ser abrumador. En este artículo vamos a aprender sobre lo siguiente:

  • Instalación de Django
  • Los comandos startproject y startapp
  • Archivos de configuración de Django que incluyen;
    • configuración.py
    • urls.py
    • gestionar.py
  • Diseño de modelos
  • Enrutamiento

Aprenderemos cómo encajan todos estos elementos y el papel que desempeñan. Es importante saber que no será posible echar un vistazo a todo lo que sucede dentro de Django. Para casos fuera del alcance de este tutorial, habrá enlaces que le indicarán recursos que lo ayudarán con eso.

Con fines de aprendizaje, construiremos una plataforma de comercio electrónico. Este no es un sitio de comercio electrónico en toda regla, nuestra aplicación tendrá solo dos características básicas; creando productos y haciendo pedidos desde la vista del administrador.

Este artículo lo guiará a través de la comprensión de los comandos, archivos y conceptos básicos prediseñados de Django. Está dirigido a desarrolladores que han usado Django o tienen la intención de usarlo y quieren saber qué sucede debajo del capó. Si bien no es obligatorio que hayas usado Django, tener experiencia con los conceptos básicos de Django antes de continuar con este artículo te dará una ventaja. Debe tener un conocimiento práctico de Python para comprender completamente lo que se cubrirá en esta pieza.

¡Más después del salto! Continúe leyendo a continuación ↓

Instalando Django

Si aún no tiene Django instalado, estos son los pasos para hacerlo.

Primero, cree un entorno virtual, llamado djangodev . Necesitas esto para aislar tu espacio de trabajo de Django y sus paquetes dependientes.

 python3 -m venv ~/.virtualenvs/djangodev

Ahora, para ingresar a su entorno virtual, debe activarlo;

 source ~/.virtualenvs/djangodev/bin/activate

Si obtiene algún error al ejecutar con la source , puede utilizar este comando alternativo,

 . ~/.virtualenvs/djangodev/bin/activate

Para usuarios de Windows, utilice esto en su lugar,

 ...\> %HOMEPATH%\.virtualenvs\djangodev\Scripts\activate.bat

Nota: Debe activar el entorno virtual cada vez que desee utilizar Django.

Ahora que estás en tu entorno virtual, instala Django:

 python -m pip install Django

Para verificar si Django se instaló correctamente, ejecute;

 python -m django --version

Shakaboom! Ahora que estás listo para un poco de magia, ¡prepara tus varitas!

El método para crear archivos y carpetas sobre la marcha puede ser simple y directo. Sin embargo, no es ideal cuando tienes que crear un proyecto mediano o grande y una fecha límite que vencer. Siempre tenemos una fecha límite que superar, incluso para proyectos personales.

Siguiendo este método al crear un nuevo proyecto grande, tendrá que crear múltiples archivos y carpetas y realizar múltiples configuraciones, lo que podría conducir a la creación de errores evitables y una gran cantidad de tiempo perdido. Los comandos startproject y startapp disponibles para nosotros a través de Django tienen como objetivo resolver este problema. Estos dos comandos crean archivos, carpetas y realizan muchas configuraciones por usted.

Comencemos generando una nueva aplicación usando el comando startproject .

Andamiaje de una aplicación

Generaremos nuestra aplicación y echaremos un vistazo a los archivos que se generan, así como algunos comandos que usaremos. Ejecute este comando en su terminal para comenzar;

 django-admin startproject ecommerce_site

Al instalar Django, se agrega django-admin a su ruta para darle acceso y realizar sus acciones. Es la utilidad de línea de comandos de Django para responsabilidades administrativas. Aprenda más usos django-admin aquí; está un poco más allá del alcance de este artículo.

startproject es un comando de Django que ayuda a generar el proyecto . Aquí le pasamos el nombre de nuestro proyecto ecommerce_site . Luego pasa a crear el proyecto en un directorio llamado ecommerce_site . El directorio debería verse así,

muestra el directorio después de startproject.
Mostrando carpeta después de ejecutar startproject. (Vista previa grande)

Tendremos que navegar al directorio recién creado y ejecutar el comando para generar la aplicación .

 cd ecommerce_site python manage.py startapp trading

startapp es un comando ejecutado por manage.py en el directorio del proyecto, crea múltiples archivos y una carpeta nombrada usando el nombre especificado en el comando, en este caso, lo que se especifica es trading . La carpeta de la aplicación consta de archivos simples que deberían ser necesarios para crear funciones de una aplicación. Ahora su directorio debería verse así:

muestra el directorio después de startapp.
Mostrando carpeta después de ejecutar startapp. (Vista previa grande)

Si se pregunta cuál es la diferencia entre un proyecto y una aplicación. Un proyecto es una aplicación web de Django, puede constar de una o más aplicaciones. Es la carpeta que contiene manage.py y el otro módulo que incluye settings.py y otros archivos. Una aplicación es un paquete de python que realiza una característica determinada, incluye archivos como models.py , el directorio de migración y más. Puede consultar esta respuesta en Stack Overflow para obtener más información.

startproject creará el directorio principal del proyecto, mientras que startapp creará el directorio de la aplicación. A ambos también se les ha pasado un nombre para ser usados ​​en la generación. startproject es el primer comando que se ejecuta al crear un nuevo proyecto, mientras que startapp se ejecuta dentro del directorio del nuevo proyecto.

El diseño actual es un excelente mapeo que puede usar para cualquier aplicación que esté creando. Es escalable y consta de los archivos que necesitará. Existe la posibilidad de crear, cambiar el nombre, editar y mover archivos dentro del proyecto.

Configuración de Django

Django proporciona diferentes ajustes y configuraciones para usted, después de ejecutar los dos comandos en diferentes archivos, repasemos los archivos generados para aprender lo que hace cada uno.

settings.py

La mayoría de las aplicaciones web necesitan configuraciones como; autenticación para verificar usuarios, permisos para permitir ciertos usuarios con ciertas habilidades y establecer estándares de seguridad. Todo esto es necesario para brindar a sus usuarios la mejor experiencia necesaria. Como desarrollador, le llevará mucho tiempo comenzar a implementar cada uno de estos por su cuenta, para cada aplicación en la que trabaje.

Django le proporciona estas configuraciones necesarias y más, de modo que puede optar por las que desee y conectarlas. Esto se realiza en settings.py , ya hay configuraciones establecidas creadas para brindarle funcionalidades básicas.

Cuando Django intenta ejecutar un proyecto, busca ciertas variables. La settings.py es el archivo que contiene esas variables que conducen a otros archivos o información. Django se dirige a este archivo desde el archivo manage.py y toma información o carga otros archivos a los que se dirige desde aquí.

Estas configuraciones incluyen:

  • DEBUG
    La funcionalidad DEBUG se establece en True para permitir la lectura de errores y el código de depuración en desarrollo, debe establecerse en False durante la producción (es decir, cuando se está implementando). Esta configuración le permite depurar mejor su código con la ayuda de Django cuando intenta ejecutar su código.
  • INSTALLED_APPS
    Esta es una lista de todas las aplicaciones que realizan una función determinada en Django. Viene con algunas aplicaciones predeterminadas como 'django.contrib.auth' que se usa para la autenticación de usuarios, django.contrib.admin' para la funcionalidad de administración y 'django.contrib.messages' necesarios para enviar notificaciones o información a los usuarios. Cualquier otra aplicación que cree usando el comando startapp tendrá que estar aquí antes de que Django pueda ejecutarla.
  • MIDDLEWARE es un marco ligero para procesar entradas y salidas a través de solicitudes y respuestas de Django. Cada middleware realiza una función específica con una aplicación, como 'django.contrib.auth.middleware.AuthenticationMiddleware' funciona con 'django.contrib.sessions' para asociar usuarios con solicitudes. Debe consultar otras características de cada middleware en los documentos.
  • ROOT_URLCONF es una variable a una ruta donde Django busca sus patrones de urlpatterns cuando se pasa una solicitud a su aplicación Django. Cada vez que se realiza una solicitud en una aplicación Django, Django busca esta variable y carga el archivo principal y recorre la lista de urlpatterns de URL en busca de la ruta correspondiente.
  • TEMPLATES es una configuración que permite la representación de archivos HTML para representar una vista. Se comunica con las aplicaciones de solicitud, autenticación y mensajes. El valor 'BACKEND' y 'APP_DIRS' establecidos en True permiten a Django buscar archivos HTML dentro de la carpeta /templates . Los 'context_processors' en OPTIONS son invocables , que toman la solicitud como un argumento y la fusionan con el contexto cuando se representa una plantilla, estos invocables funcionan para ayudar con la depuración, autenticación y manejo de solicitudes en general.
  • WSGI_APPLICATION es una ruta que conduce a la variable de la application en el archivo wsgi.py
  • DATABASE es un diccionario que tiene acceso a una base de datos externa (o interna como en el caso del sqlite predeterminado) como PostgresSQL, MySQL y MongoDB. Aquí hay un ejemplo de una base de datos de Postgres que usaré para nuestro ejemplo:
 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'db_name', 'USER': 'db_user', 'PASSWORD': 'db_password', 'HOST': 'localhost', 'PORT': '', } }

Puede decidir usar la base de datos sqlite predeterminada, esto no funciona muy bien para la producción. Puede configurar una base de datos de Postgres como la anterior, primero deberá crear la base de datos y pasar el usuario, la contraseña con permiso de escritura a la base de datos.

Nota : para los fines de este tutorial, ya puede usar la base de datos SQLite predeterminada. Lo anterior es una demostración de cómo puede establecer una conexión de base de datos SQL y NO-SQL en Django.

  • AUTH_PASSWORD_VALIDATORS estas son funciones que se llaman para validaciones de contraseña. Se llaman cuando se crean registros de usuarios (y también de administradores), se restablecen y se cambian contraseñas. Puede obtener más información sobre ellos en la documentación oficial.

Puede encontrar más documentación sobre la configuración aquí.

manage.py

La mayoría de los proyectos web necesitan un punto de entrada desde donde comienzan los comandos. Un punto de entrada que actúa como puerta de entrada a la aplicación. En todos los proyectos de Django, suele ser el archivo manage.py .

Este archivo es necesario como punto de partida en su aplicación. Desde aquí, se ejecutan todos los comandos y todo comienza aquí.

manage.py hace la misma función que django-admin. También le dice a Django la ubicación de las configuraciones que tiene en su aplicación. Esto está configurado de forma predeterminada y no es necesario cambiarlo.

Utiliza la función def main() para manejar el módulo de configuración predeterminado en nuestro archivo settings.py . Intenta importar la función de ejecución y, si se produce un error, arroja ImportError . De lo contrario, toma cualquier argumento pasado por sys.argv desde la línea de comandos y se ejecuta.

sys.argv es una lista que toma el comando pasado a través de la terminal. Cuando ejecutamos python manage.py runserver en la línea de comandos, sys.argv se establece en ["manage.py", "runserver"] y se pasa a la función execute() .

Argumentos como python manage.py startapp trading o python manage.py makemigrations se establecen en [ "manage.py", "startapp", "trading"] y ["manage.py", "makemigrations"] respectivamente para su ejecución.

La declaración if está configurada para ejecutarse si el comando dado se establece en manage.py .

Además de ejecutar las funciones de django-admin , lo usará para ejecutar el servidor, manejar las migraciones y otros comandos que usará su proyecto. También lo necesitará al implementar, probar y depurar sus proyectos.

Diseño del modelo

Django proporciona un diseño de modelado simple para usted. Configura sus modelos en el archivo models.py en el directorio trading . Sus clases (o modelos) son diseños que seguirán las tablas de su base de datos.

Usted define sus clases en función de los tipos de datos que desea obtener del usuario (o del administrador) para cada tabla. Nuestros modelos crean un archivo de migración que funciona con la variable DATABASE en settings.py .

Vamos a crear dos modelos que necesitaremos, para productos y pedidos:

 from django.db import models class Product(models.Model): name = models.CharField(max_length=50) image = models.ImageField(upload_to='products', default='python.png') price = models.IntegerField() description = models.TextField() def __str__(self): return self.name class Order(models.Model): product = models.ForeignKey(Product, on_delete=models.CASCADE) quantity = models.IntegerField() date = models.DateField(auto_now_add=True) user = models.CharField(max_length=50) def __str__(self): return self.user

El modelo del producto tiene columnas de nombre, precio, descripción y una imagen (que, cuando se guarde, se cargará en una carpeta de products . Esta se crea si la carpeta no existe). El order tiene un product (vinculado a la tabla de products ), las columnas cantidad, fecha y usuario.

Con esta información, Django crea un esquema de base de datos para la aplicación. Además, crea una API de acceso a la base de datos de Python para acceder a los objetos Producto y Pedido. Django tiene una herramienta de migración integrada para que no tengas que usar paquetes externos para las migraciones.

El siguiente paso es ejecutar el comando de migración y migrar a la base de datos. Pero antes de hacer eso, debemos registrar el trading como una aplicación en nuestro directorio de proyectos.

En primer lugar, tenemos que configurar el directorio comercial como una aplicación en Django. Django lo ha hecho por usted en el archivo app.py Este archivo registra el trading como una aplicación y se utilizará más en el archivo settings.py .

Ahora, en settings.py agregue trading en INSTALLED_APP . Debe tener un aspecto como este:

 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'trading.apps.TradingConf', ]

En la terminal, ejecuta:

 $ python manage.py makemigrations trading $ python manage.py migrate

Nota: Su entorno virtual debe estar activado y debe estar dentro del directorio del proyecto.

python manage.py makemigrations trading toma nota de los cambios realizados en el módulo comercial y crea un archivo en la carpeta de migration de cambios en models.py y python manage.py migrate luego actualiza los cambios.

Puede encontrar el archivo de migración generado desde el comando python manage.py makemigrations trading en el directorio de migration llamado 0001_initial.py . Puede ver las clases y columnas como comandos para la creación dentro del archivo. A medida que se realicen más cambios en models.py , se generarán más archivos aquí.

Funciones de administrador

En nuestra aplicación actual, necesitaremos funciones de administrador para administrar los productos y pedidos que se crearán en la aplicación. Django nos proporciona una funcionalidad de administración integrada que ya está a nuestra disposición. La aplicación (función) de administración también se ha registrado en nuestra lista INSTALLED_APP ; 'django.contrib.admin' .

Además, la URL para el administrador también se ha registrado en la lista de urlpatterns de nuestro archivo de configuración de URL urls.py ; path('admin/', admin.site.urls), . El archivo admin.py le permite registrar modelos y las acciones CRUD que se realizarán en los modelos.

Para configurar el administrador, ejecute esto en la terminal:

 $ python manage.py createsuperuser

Se le pedirá que ingrese un nombre de usuario, correo electrónico y contraseña. Después de eso, habrá creado con éxito un administrador. Para comenzar con la funcionalidad de administración, ejecute el servidor:

 $ python manage.py runserver

Visitar https://127.0.0.1:8000/admin/ lo llevará a una sesión de inicio de sesión, cuando inicie sesión (con el nombre de usuario y la contraseña que creó) será dirigido al panel de administración:

esto muestra el panel de administración.
Panel de administración proporcionado por Django. (Vista previa grande)

Los grupos y usuarios son configuraciones predeterminadas que permiten al administrador acceder a la administración y los permisos de los usuarios. Ahora vamos a registrar nuestros modelos.

En admin.py , agregue las siguientes líneas:

 from django.contrib import admin # Register your models here. from .models import Product, Order admin.site.register(Product) admin.site.register(Order)

from django.contrib import admin importa la funcionalidad de administración de Django, y luego importamos las dos clases de nuestros models.py y las registramos para que un administrador pueda realizar acciones CRUD en productos y ordenar desde el tablero.

Después de registrar los modelos, su tablero debería verse así:

mostrando el panel de administración con productos y modelo de pedido.
Modelo de producto y pedido en el panel de administración. (Vista previa grande)

Agregando productos:

esto muestra a admin admin agregando un producto al sitio.
Administrador agregando un producto (zapato) al sitio. (Vista previa grande)

Hacer pedidos desde el panel de administración:

Imagen que muestra al administrador haciendo pedidos.
Administrador agregando/haciendo pedidos. (Vista previa grande)

Enrutamiento fácil

Cada sitio necesita rutas o URL que conduzcan a páginas específicas con cierta información para el usuario final. Se accede a colecciones de información o aplicación similar en una ruta particular. Existe la necesidad de agrupar rutas para accesibilidad y comunicación dentro de los archivos. Django lo ha hecho por usted en el archivo urls.py

El urls.py es un archivo que se deriva de la variable ROOT_CONF en settings.py . Aquí es donde se realiza nuestra configuración de URL principal. Cuando creamos vistas en diferentes archivos o carpetas, o incluso en el archivo urls.py , se tienen que configurar en la lista de urlpatterns .

Django espera una lista llamada urlpatterns en el archivo. Puede cambiar el archivo en la variable ROOT_CONF a cualquier otro archivo que haya colocado en la lista de urlpatterns de URL.

 urlpatterns = [ path('admin/', admin.site.urls), ]

La lista consta de objetos que son instancias de path o re-path . Cada instancia tiene dos parámetros obligatorios, el patrón 'admin/' y un archivo de vista o URL, admin.site.urls .

Las instancias también podrían conducir a otro archivo con más configuraciones de URL. Esto se hace por legibilidad.

views.py

Una necesidad importante para una aplicación de back-end son las vistas a las que se asigna cada ruta. En Django, escribe sus vistas basadas en funciones o clases para una aplicación en el archivo views.py . Una vista es una clase o función que procesa una solicitud y envía una respuesta a su usuario.

Edite su archivo views.py a esto:

 from django.http import HttpResponse def home(request): return HttpResponse("This is a shopping site for products") def order(request): return HttpResponse("Hello, welcome to our store, browse to our products and order!")

Aquí HTTPResponse para usarlo en la definición de dos vistas (vistas de función) para devolver la oración cuando se le solicite. def home debe llamarse cuando visite la dirección principal y def order cuando acceda a la URL del pedido.

Después de crear nuestras vistas, debemos asignarlas a diferentes rutas (o urlpatterns ). Eso se puede hacer de varias maneras, podemos crear una lista de urlpatterns de URL en el mismo archivo, o podemos importar trading.views en el archivo ecommerce_site.urls y crear la ruta.

La forma preferida de hacerlo es crear un archivo de configuración de URL secundaria ( trading interno) e incluirlo en ecommerce_site.urls . Cree un archivo urls.py en el directorio trading . Su directorio debería verse así:

 trading/ __init__.py admin.py apps.py migrations/ __init__.py 0001_initial.py models.py tests.py urls.py views.py

Agregue el siguiente código a su nuevo archivo ( urls.py )

 from django.urls import path from . import views urlpatterns = [ path('', views.home, name='home'), path('order/', views.order, name='order'), ]

Registremos el archivo de configuración de URL trading ( urls.py ) en el archivo de configuración de URL del proyecto,

 from django.contrib import admin from django.urls import include, path urlpatterns = [ path('admin/', admin.site.urls), path('', include('trading.urls')) ]

Para poder acceder a los patrones de urlpatterns , usaremos la clase de include de django.urls en la línea 2. Luego, elija un patrón y adjunte el archivo urls.py en el directorio comercial.

Lo que hicimos aquí fue importar la clase de path de Django y el archivo views.py . Entonces nuestra lista consta de dos instancias de ruta para cada vista. Así que def home en https://127.0.0.1:8000/.

imagen que muestra cuando visita el sitio de inicio.
Sitio cuando visitas la página de inicio. (Vista previa grande)

Y el def order se llama en https://127.0.0.1:8000/order/.

muestra el sitio cuando visita la URL del pedido.
URL del pedido visitado. (Vista previa grande)

Nota: el proceso de ejecución de startproject y startapp no ​​es obligatorio, pero Django lo recomienda encarecidamente. Y puede crear/mover archivos y carpetas después de ejecutar cada comando según su conveniencia laboral.

Árbol de dependencia

Este es el proceso en el que Django procesa las solicitudes de las URL que llegan:

  1. Django busca la ubicación raíz (ruta) de sus URL en la variable ROOT_CONF .
  2. Django carga el archivo python proporcionado en la ruta proporcionada. Y ubica la variable urlpatterns , esta es una lista que contiene todas las instancias de django.urls.path() y/o django.urls.re_path() .
  3. En la lista, Django va en orden y busca una URL coincidente.
  4. Python, importa y llama a la vista (ya sea vista basada en funciones o basada en clases). Que se promueve con la solicitud HTTP.
  5. La vista procesa la solicitud y la información pasada y devuelve un mensaje/plantilla o redirige a otra vista.
  6. Si no coincide ningún patrón de URL, o si se genera una excepción durante cualquier punto de este proceso, Django invoca una vista de manejo de errores adecuada.
Árbol que muestra cómo Django maneja las solicitudes.
Manejo de solicitudes de Django. (Vista previa grande)

Conclusión

Hemos conocido la posibilidad de crear archivos para Django sin la línea de comandos. También hemos aprendido las ventajas y los componentes básicos de un proyecto Django. Django es una herramienta increíble en la construcción de proyectos back-end con el objetivo de crear simplicidad.

Puede consultar el código de este tutorial en GitHub.

Recursos

  • Gestión de contraseñas en Django
  • Django: Primeros pasos
  • Django: Configuración
  • Django ligero de O'Reilly