Desmitificando la Magia de Django
Publicado: 2022-03-10Segú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
ystartapp
- 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.
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í,
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í:
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 funcionalidadDEBUG
se establece enTrue
para permitir la lectura de errores y el código de depuración en desarrollo, debe establecerse enFalse
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 comandostartapp
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 deurlpatterns
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 deurlpatterns
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 enTrue
permiten a Django buscar archivos HTML dentro de la carpeta /templates . Los'context_processors'
enOPTIONS
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 laapplication
en el archivowsgi.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:
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í:
Agregando productos:
Hacer pedidos desde el panel de administración:
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/.
Y el def order
se llama en https://127.0.0.1:8000/order/.
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:
- Django busca la ubicación raíz (ruta) de sus URL en la variable
ROOT_CONF
. - Django carga el archivo python proporcionado en la ruta proporcionada. Y ubica la variable
urlpatterns
, esta es una lista que contiene todas las instancias dedjango.urls.path()
y/odjango.urls.re_path()
. - En la lista, Django va en orden y busca una URL coincidente.
- Python, importa y llama a la vista (ya sea vista basada en funciones o basada en clases). Que se promueve con la solicitud HTTP.
- La vista procesa la solicitud y la información pasada y devuelve un mensaje/plantilla o redirige a otra vista.
- 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.
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