Table of Contents
Esta semana estuve pensando mucho en el flujo de trabajo. Al observar mis tareas diarias, me di cuenta de que configurar los proyectos de Django me estaba llevando más tiempo del necesario. Instalar Django es rápido, especialmente si se utiliza Astral-UV, que lo pone en funcionamiento en menos de un minuto. Pero eso es solo el principio. Después de la instalación, dedicaba tiempo a los mismos pasos tediosos: crear estructuras de directorios, configurar plantillas, agregar archivos esenciales como urls.py y forms.py, y crear archivos HTML de marcador de posición para páginas como la página de inicio y la página de contacto. Estas tareas repetitivas se sumaban, así que decidí automatizar la mayor parte posible del proceso de configuración de Django y ahorrarme una cantidad significativa de tiempo.
La flexibilidad de Python lo hace ideal para la automatización. Sus herramientas para el manejo de archivos, la gestión de subprocesos y el análisis de la línea de comandos fueron perfectas para crear una herramienta que pudiera manejar toda la configuración que necesitaba. Estructuré la herramienta con clases modulares para cada parte del proceso de configuración, por lo que era fácil de adaptar si quería hacer ajustes en el futuro. También quería que la herramienta fuera fácil de usar, por lo que la diseñé para que funcionara con un solo comando. Ejecutar python3 main.py <project_name> <optional_app_name> desde el directorio de nivel superior donde quiero crear proyectos de Django es todo lo que necesito. Este comando se encarga de todo: instala Django, crea una aplicación opcional, configura la estructura de directorio correcta y genera archivos esenciales con contenido de marcador de posición.
Este script sólo funciona en sistemas basados en Debian (Debian, Ubuntu, etc.).
El primer paso del script es comprobar el software necesario, como snapd y uv. Utilicé el módulo subprocess de Python para ejecutar estas comprobaciones. Así es como lo hice para snapd:
import subprocess def check_snapd_installed(): """Check if 'snapd' is installed by trying to call the snap version command.""" try: subprocess.run(['snap', '--version'], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) print("'snapd' is already installed.") return True except FileNotFoundError: print("'snapd' is not found; it needs to be installed.") return False
Esta función comprueba la existencia de snapd llamando a snap –version. Si el comando devuelve un error, el script me informa que falta snapd y me solicita que lo instale. Utilicé funciones similares para otras dependencias, asegurándome de poder ejecutar la herramienta en cualquier sistema y tener listo el software necesario.
Configurar la estructura del directorio del proyecto fue un poco más desafiante. Tuve que considerar casos en los que un usuario podría ingresar una ruta relativa o una ruta que ya existe. Para evitar conflictos de directorios y evitar el uso de nombres reservados de Django como static o media, el script valida el nombre del directorio y, si hay un problema, solicita un nuevo nombre. Una vez que se valida y crea el directorio, UV maneja la configuración del backend, incluida la inicialización del entorno virtual, la adición de Django y la creación de un archivo .gitignore. Aquí hay un fragmento que maneja la configuración del directorio:
def prompt_for_directory(): """Prompt user for the directory where the Django project should be installed.""" disallowed_names = {'test', 'django', 'site', 'admin', 'main', 'manage', 'static', 'templates', 'media'} while True: directory = input("Enter the directory where you want to install the Django project: ") directory_name = os.path.basename(os.path.normpath(directory)) if directory_name.lower() in disallowed_names: print(f"The directory name '{directory_name}' is reserved and cannot be used.") else: os.makedirs(directory, exist_ok=True) os.chdir(directory) print(f"Changed directory to {directory}") break
Esta configuración garantiza que el nombre del directorio elegido no entre en conflicto con los nombres reservados, lo que evita posibles problemas en el futuro.
Una parte tediosa de la configuración de un proyecto de Django es la configuración de las variables de entorno, por lo que la automaticé haciendo que la herramienta genere automáticamente los archivos .env y .env-template en la raíz del proyecto. Cada archivo viene precargado con valores predeterminados como DEBUG=True, marcadores de posición para SECRET_KEY y DATABASE_URL. Esto ahorra tiempo y garantiza una configuración consistente en todos los proyectos. Este es el fragmento que crea estos archivos:
env_content = ( "# Environment variables\n" "DEBUG=True\n" "SECRET_KEY=your-secret-key\n" "DATABASE_URL=your-database-url\n" ) with open(".env", 'w') as f: f.write(env_content) print("Created .env in the installation directory.") with open(".env-template", 'w') as f: f.write(env_content) print("Created .env-template in the installation directory.")
Con estos Los archivos se configuran automáticamente y cada nuevo proyecto de Django está listo para las variables de entorno desde el principio, lo que me ahorra tener que agregar estas configuraciones manualmente.
La herramienta también crea automáticamente archivos esenciales del proyecto, como base.html, y directorios para plantillas y recursos estáticos. El script configura subdirectorios para CSS, JavaScript e imágenes dentro de la carpeta estática, junto con una carpeta de elementos parciales en el directorio de plantillas principal. Para el directorio de plantillas de la aplicación, crea archivos HTML básicos, como index.html, about.html y contact.html, con contenido de marcador de posición. Así es como se ve esa sección en el código:
html_files = { "index.html": " ", "about.html": " ", "contact.html": " ", } for filename, content in html_files.items(): with open(f"{app_template_path}/{filename}", 'w') as f: f.write(content) print(f"Created {filename} in {app_template_path}")
Esta sencilla configuración proporciona coherencia y me ahorra la necesidad de crear estos archivos manualmente repetidamente.
Para utilizar la herramienta, simplemente navego hasta un directorio de nivel superior donde quiero mis proyectos de Django y ejecuto python3 main.py <project_name> <optional_app_name>. Este comando hace todo. Verifica las dependencias, configura el directorio, instala Django con UV, crea plantillas y archivos estáticos, inicializa Git y genera archivos de configuración, todo en unos pocos segundos. Puedo comenzar a codificar inmediatamente con un proyecto completamente estructurado, saltándome todas las tareas de configuración repetitivas.
Esta herramienta se ha convertido en un gran ahorro de tiempo para mí. Al automatizar la configuración, he eliminado el trabajo tedioso que solía implicar cada nuevo proyecto de Django. Ahora, en lugar de dedicar tiempo a la estructura de directorios y la creación de archivos, puedo pasar directamente al desarrollo con una configuración limpia y consistente en todo momento. La flexibilidad de Python hizo posible esta herramienta, y ya he empezado a pensar en funciones adicionales para añadir en el futuro. Para cualquiera que trabaje regularmente con Django, esta herramienta es un cambio radical, ya que permite dedicar más tiempo a la creación y menos a la configuración.
Puedes ver el script completo en el repositorio de Github que configuré para el proyecto.