Cómo instalar Django Framework en Debian 11

Django es un marco de desarrollo web gratuito y de código abierto escrito en Python. Se utiliza para desarrollar aplicaciones Python complejas y basadas en bases de datos. Viene con un conjunto de scripts de Python para crear proyectos de Python. Se puede ejecutar en cualquier sistema operativo que pueda ejecutar Python, incluyendo Windows, macOS, Linux/Unix y Solaris. Ayuda a los desarrolladores a escribir menos código y a crear un nuevo sitio web en poco tiempo.

En este tutorial, explicaré cómo configurar Django en el entorno virtual de Python utilizando la base de datos PostgreSQL en Debian 11. A continuación, instalaremos y configuraremos Nginx como proxy inverso para Django.

Requisitos previos

  • Un servidor con Debian 11.
  • Un nombre de dominio válido apuntado con la IP de tu servidor.
  • Una contraseña de root configurada en el servidor.

Cómo empezar

Antes de empezar, es conveniente que actualices los paquetes de tu sistema a la última versión. Puedes hacerlo con el siguiente comando:

apt-get update -y

Una vez actualizados todos los paquetes, instala otras herramientas de Python y el paquete Nginx con el siguiente comando:

apt-get install python3-pip python3-dev libpq-dev curl nginx -y

Una vez instalados todos los paquetes necesarios, puedes pasar al siguiente paso.

Instalar el servidor de bases de datos PostgreSQL

Aquí utilizaremos PostgreSQL como base de datos. Así que vamos a instalarlo con el siguiente comando:

apt-get install postgresql postgresql-contrib -y

Una vez instalado PostgreSQL, conéctate al shell de PostgreSQL con el siguiente comando:

su - postgres
psql

A continuación, crea una base de datos y un usuario para Django con el siguiente comando:

CREATE DATABASE django;
CREATE USER django WITH PASSWORD 'password';

A continuación, concede algunos roles necesarios con el siguiente comando:

ALTER ROLE django SET client_encoding TO 'utf8';
ALTER ROLE django SET default_transaction_isolation TO 'read committed';
ALTER ROLE django SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE django TO django;

A continuación, sal del shell PostgreSQL con el siguiente comando:

\q
exit

En este punto, la base de datos PostgreSQL está lista para Django. Ahora puedes pasar al siguiente paso.

Crear un entorno virtual de Python

A continuación, tendrás que crear un entorno virtual de Python para crear un proyecto Django.

En primer lugar, actualiza el paquete PIP a la última versión utilizando el siguiente comando:

pip3 install --upgrade pip

A continuación, verifica la versión de PIP utilizando el siguiente comando:

pip --version

Salida de ejemplo:

pip 21.2.4 from /usr/local/lib/python3.9/dist-packages/pip (python 3.9)

A continuación, instala el paquete del entorno virtual utilizando el siguiente comando:

pip3 install virtualenv

A continuación, crea un directorio para el proyecto Django y crea un entorno virtual Django:

mkdir ~/djangoapp
cd ~/djangoapp
virtualenv djangoenv

A continuación, activa el entorno virtual de Django mediante el siguiente comando

source djangoenv/bin/activate

A continuación, instala los paquetes Django, Gunicorn y otros utilizando el siguiente comando:

pip install django gunicorn psycopg2-binary

En este punto, Django está instalado en el entorno virtual de Python. Ahora, puedes pasar al siguiente paso.

Instalar y configurar Django

Django proporciona un script django-admin.py para crear un proyecto. Puedes ejecutar el siguiente comando para crear un proyecto Django:

django-admin.py startproject djangoapp ~/djangoapp

A continuación, tendrás que editar el archivo settings.py y definir la configuración de tu base de datos:

nano ~/djangoapp/djangoapp/settings.py

Cambia la siguiente línea con tu nombre de dominio:

ALLOWED_HOSTS = ['django.example.com', 'localhost']

Descomenta el backend de la base de datos por defecto y añade la configuración de la base de datos PostgreSQL:

#DATABASES = {
#    'default': {
#        'ENGINE': 'django.db.backends.sqlite3',
#        'NAME': BASE_DIR / 'db.sqlite3',
#    }
#}

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'django',
        'USER': 'django',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',

    }
}

Añade las siguientes líneas al final del archivo:

STATIC_URL = '/static/'
import os
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

Guarda y cierra el archivo y luego migra el esquema inicial de la base de datos a la base de datos PostgreSQL:

./manage.py makemigrations
./manage.py migrate

Ejemplo de salidaL:

  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

A continuación, crea una cuenta de superusuario para Django con el siguiente comando:

./manage.py createsuperuser

Establece tu nombre de usuario y contraseña de administrador como se muestra a continuación:

Username (leave blank to use 'root'): dadmin
Email address: [email protected]
Password: 
Password (again): 
Superuser created successfully.

A continuación, reúne todo el contenido estático en el directorio:

./manage.py collectstatic

Ejecuta el servidor de desarrollo de Django

En este punto, Django está instalado y configurado. Ahora puedes iniciar el servidor de desarrollo de Django con el siguiente comando:

./manage.py runserver 0.0.0.0:8000

Si todo va bien, deberías obtener la siguiente salida:

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
August 27, 2021 - 10:02:05
Django version 3.2.6, using settings 'djangoapp.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

Ahora, abre tu navegador web y accede a tu proyecto Django utilizando la URL http://django.example.com:8000/admin/. Serás redirigido a la página de inicio de sesión de Django:

Inicio de sesión en Django

Proporciona tu nombre de usuario y contraseña de administrador y haz clic en Login. Deberías ver el panel de control de Django en la siguiente página:

Panel de administración de Django

Ahora, vuelve a tu terminal y pulsa CTRL + C para detener el servidor de desarrollo de Django.

Verificar Django con Gunicorn

A continuación, también tendrás que comprobar si el Gunicorn puede servir el Django o no. Puedes iniciar el Django con el servidor Gunicorn con el siguiente comando:

gunicorn --bind 0.0.0.0:8000 djangoapp.wsgi

Si todo va bien, deberías obtener la siguiente salida:

[2021-08-27 10:04:22 +0000] [47383] [INFO] Starting gunicorn 20.1.0
[2021-08-27 10:04:22 +0000] [47383] [INFO] Listening at: http://0.0.0.0:8000 (47383)
[2021-08-27 10:04:22 +0000] [47383] [INFO] Using worker: sync
[2021-08-27 10:04:22 +0000] [47384] [INFO] Booting worker with pid: 47384

Pulsa CTRL + C para detener el servidor de Gunicorn.

A continuación, desactiva del entorno virtual Python con el siguiente comando:

deactivate

Crea un archivo de servicio Systemd para Gunicorn

A continuación, tendrás que crear un archivo de servicio systemd para que Gunicorn inicie y detenga el servidor de aplicaciones Django.

Puedes crear un Gunicorn con el siguiente comando:

nano /etc/systemd/system/gunicorn.socket

Añade las siguientes líneas:

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

Guarda y cierra el archivo y luego crea un archivo de servicio para Gunicorn:

nano /etc/systemd/system/gunicorn.service

Añade las siguientes líneas que coincidan con la ruta de tu proyecto Django:

[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=root
Group=www-data
WorkingDirectory=/root/djangoapp
ExecStart=/root/djangoapp/djangoenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock          djangoapp.wsgi:application

[Install]
WantedBy=multi-user.target

Guarda y cierra el archivo y luego establece los permisos adecuados para el directorio del proyecto Django:

chown -R www-data:root ~/djangoapp

A continuación, recarga el demonio systemd con el siguiente comando:

systemctl daemon-reload

A continuación, inicia el servicio Gunicorn y habilítalo para que se inicie al reiniciar el sistema:

systemctl start gunicorn.socket
systemctl enable gunicorn.socket

A continuación, comprueba el estado de Gunicorn con el siguiente comando:

systemctl status gunicorn.socket

Deberías obtener la siguiente salida:

? gunicorn.socket - gunicorn socket
     Loaded: loaded (/etc/systemd/system/gunicorn.socket; disabled; vendor preset: enabled)
     Active: active (listening) since Fri 2021-08-27 10:05:46 UTC; 6s ago
   Triggers: ? gunicorn.service
     Listen: /run/gunicorn.sock (Stream)
     CGroup: /system.slice/gunicorn.socket

Aug 27 10:05:46 debian11 systemd[1]: Listening on gunicorn socket.

Configurar Nginx como proxy inverso para Django

A continuación, tendrás que configurar Nginx como proxy inverso para servir a Django.

Para ello, crea un archivo de configuración de Nginx:

nano /etc/nginx/conf.d/django.conf

Añade las siguientes líneas:

server {
     listen 80;
     server_name django.example.com;
    location = /favicon.ico { access_log off; log_not_found off; }


    location /static/ {
         root /root/djangoapp;
     }

    location / {
         include proxy_params;
         proxy_pass http://unix:/run/gunicorn.sock;
     }
}

Guarda y cierra el archivo y luego verifica que Nginx no tenga ningún error de configuración:

nginx -t
Output:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Por último, reinicia el servicio Nginx para aplicar los cambios:

systemctl restart nginx

Para comprobar el estado del Nginx, ejecuta:

systemctl status nginx

Ejemplo de salida:

? nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2021-08-27 10:06:59 UTC; 6s ago
       Docs: man:nginx(8)
    Process: 47494 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 47495 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 47496 (nginx)
      Tasks: 2 (limit: 2341)
     Memory: 2.5M
        CPU: 49ms
     CGroup: /system.slice/nginx.service
             ??47496 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             ??47497 nginx: worker process

Aug 27 10:06:59 debian11 systemd[1]: Starting A high performance web server and a reverse proxy server...
Aug 27 10:06:59 debian11 systemd[1]: nginx.service: Failed to parse PID from file /run/nginx.pid: Invalid argument
Aug 27 10:06:59 debian11 systemd[1]: Started A high performance web server and a reverse proxy server.

Ahora puedes acceder a la aplicación Django utilizando la URL http://django.example.com/admin. También puedes acceder a la aplicación Django utilizando la URL http://django.example.com/.

Aplicación Django

Conclusión

Enhorabuena! has instalado con éxito una aplicación Django con Gunicorn y Nginx como proxy inverso. Ahora puedes empezar a desplegar tu aplicación Python utilizando el framework Django.

También te podría gustar...