Introducción
Buenas, en este post vamos a desarrollar la aplicación del tutorial de django 3.1.. Primero lo haremos en un entorno de desarrollo y posteriormente en un entorno de producción.
Entorno de desarrollo
Vamos a configurar nuestro equipo para trabajar con la aplicación:
-
Realizamos un fork del repositorio:
git clone git@github.com:acabe10/django_tutorial.git -
Creamos entorno
python3 -m venv django source django/bin/activate -
Instalamos las dependencias necesarias:
pip install -r requirements.txt -
Creamos base de datos. La base de datos se llamará:
db.sqlite3La creamos:
python3 manage.py migrate -
Creamos usuario
python3 manage.py createsuperuser -
Lanzamos el servidor en desarrollo:
python3 manage.py runserver -
Comprobación


Entorno de producción
Suponiendo que ya tenemos una máquina creada en el cloud.
-
Instalaciones necesarias
Instalamos
apache2,git,mariadby lo necesario para crear entornos:sudo apt install apache2 git python3-venv mariadb-server mariadb-clientInstalamos el módulo necesario:
sudo apt install libapache2-mod-wsgi-py3Comprobamos que el módulo está activo:
sudo apache2ctl -M -
Clonamos el repositorio
Clonamos el repositorio en el
DocumentRootde nuestro virtualhost:cd /var/www/html/ sudo git clone https://github.com/acabe10/django_tutorial -
Entorno virtual
Creamos un nuevo entorno:
python3 -m venv /home/debian/djangoLo activamos:
source /home/debian/django/bin/activate -
Instalamos dependencias y el módulo que permite a
pythontrabajar conmysql:cd /var/www/html/django_tutorial pip install -r requirements.txt pip install mysql-connector-python -
MariaDB
Accedemos y creamos usuario nuevo y bd:
sudo mysql -u root > GRANT ALL PRIVILEGES ON *.* TO 'ale'@'%' IDENTIFIED BY 'ale' WITH GRANT OPTION;flush privileges; > create database python3; -
Configuración aplicación base de datos
Accedemos al archivo de configuración de la app:
sudo nano /var/www/html/django_tutorial/django_tutorial/settings.pyCambiamos la base de datos:
DATABASES = { 'default': { 'ENGINE': 'mysql.connector.django', 'NAME': 'python3', 'USER': 'ale', 'PASSWORD': 'ale', 'HOST': 'localhost', 'PORT': '', } } -
Migración base de datos
python3 manage.py migratePodemos confirmar viendo las tablas en nuestro usuario de mariadb:
MariaDB [python3]> show tables; +----------------------------+ | Tables_in_python3 | +----------------------------+ | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | django_admin_log | | django_content_type | | django_migrations | | django_session | | polls_choice | | polls_question | +----------------------------+ -
Creación usuario
Creamos usuario administrador de django:
python3 manage.py createsuperuser Username (leave blank to use 'debian'): ale Email address: ale@ale.com Password: Password (again): The password is too similar to the username. This password is too short. It must contain at least 8 characters. This password is too common. Bypass password validation and create user anyway? [y/N]: y Superuser created successfully. -
Configuración virtualhost
Abrimos el fichero de configuración de nuestro virtualhost:
sudo nano /etc/apache2/sites-available/000-default.confY lo dejamos de la siguiente forma:
<VirtualHost *:80> ServerName www.ale-temp.com ServerAdmin webmaster@localhost DocumentRoot /var/www/html/django_tutorial WSGIDaemonProcess django_tutorial user=www-data group=www-data processes=1 threads=5 python-path=/var/www/html/django_tutorial:/home/debian/django/lib/python3.7/site-packages WSGIScriptAlias / /var/www/html/django_tutorial/django_tutorial/wsgi.py <Directory /var/www/html/django_tutorial> WSGIProcessGroup django_tutorial WSGIApplicationGroup %{GLOBAL} Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> -
Reiniciamos el servicio:
sudo systemctl restart apache2 -
Comprobaciones
Si comprobamos nos sale el siguiente error:

Para resolverlo, tendremos que editar el fichero de configuración:
sudo nano /var/www/html/django_tutorial/django_tutorial/settings.pyY modificar el ALLOWED_HOSTS dejándolo para que funcione tanto en desarrolo como en producción:
ALLOWED_HOSTS = ['www.ale-temp.com','www.ale-arya.com']Compruebo que nos carga la página, pero sin la hoja de estilo:


-
Mostrar hojas de estilo
Para poder mostrar las hojas de estilo en django, creamos un STATIC_ROOT para decirle dónde estarán nuestros ficheros, para ello:
sudo nano /var/www/html/django_tutorial/django_tutorial/settings.pyY añadimos:
STATIC_ROOT= '/var/www/html/django_tutorial/static/'También editamos el fichero de configuración de nuestro virtualhost para que obtenga los fichero de dicho lugar:
sudo nano /etc/apache2/sites-available/000-default.confY añadimos lo siguiente:
Alias /static /var/www/html/django_tutorial/static <Directory /var/www/html/django_tutorial/static> Require all granted </Directory>Ahora tendremos que indicarle que mueva los archivos que están en el directorio de nuestro sitios para el administrador a la ruta mencionada en el STATIC_ROOT (este paso lo tenemos que hacer con nuestro entorno virtual activo):
python3 manage.py collectstaticY comprobamos que hemos obtenido los archivos:
ls /var/www/html/django_tutorial/static admin pollsReiniciamos el servicio:
sudo systemctl restart apache2Comprobamos:

-
Modo debug
Vamos al fichero:
sudo nano /var/www/html/django_tutorial/django_tutorial/settings.pyY cambiamos:
DEBUG = False
Modificación de aplicación
-
Añadimos nuestro nombre
Para que nuestro nombre aparezca arriba de la página de las encuestas modificamos:
sudo nano /var/www/html/django_tutorial/polls/templates/polls/index.htmlY lo dejamos de la siguiente forma:
... <h1>Alejandro Cabezas</h1> ...Comprobamos en desarrollo:

Y para que los cambios sean efectivos en producción:
git commit -am "añado nombre" git pushY en producción ejecutamos:
sudo git pullComprobamos en producción:

-
Modificar imagen de fondo
En desarrollo, en la ruta:
/var/www/html/django_tutorial/polls/static/polls/imagesAñadimos una nueva imagen y comprobamos:

Subimos a github:
git commit -am "añado background" git pushY en producción ejecuto:
sudo git pullY comprobamos:

-
Crear nueva tabla
Nos vamos a:
sudo nano /var/www/html/django_tutorial/polls/models.pyY añadimos:
class Categoria(models.Model): Abr = models.CharField(max_length=4) Nombre = models.CharField(max_length=50) def __str__(self): return self.Abr+" - "+self.NombreEjecutamos para crear la nueva migración:
python3 manage.py makemigrations Migrations for 'polls': polls/migrations/0002_categoria.py - Create model CategoriaY realizamos la migración:
python3 manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, polls, sessions Running migrations: Applying polls.0002_categoria... OKAhora añadimos el nuevo modelo al sitio de administración de django, añadiendo en la segunda línea el nombre del modelo
from .models import Choice, Question, CategoriaY al final de la línea:
admin.site.register(Categoria)Comprobamos en desarrollo:

Subimos a git:
git add polls/migrations/0002_categoria.py git commit -am "nuevo modelo" git pushY en producción:
sudo git pullY comprobamos:
