Análisis de la estructura de proyectos Django

Al comprender la estructura de proyectos de Django, podemos organizar el código de manera más eficiente, seguir las mejores prácticas de Django y construir aplicaciones web mantenibles.

En el capítulo anterior ya aprendimos a usardjango-admin startprojectAl crear un nuevo proyecto con el comando, Django genera automáticamente la siguiente estructura básica:
myproject/
│
├── manage.py
└── myproject/
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

Usa django-admin para crear el proyecto HelloWorld:

django-admin startproject HelloWorld

Una vez completada la creación, podemos ver la estructura de directorios del proyecto:

Archivo/DirectorioDescripción detallada
manage.pyHerramienta de gestión de línea de comandos del proyecto Django, que encapsuladjango-adminla funcionalidad de, y configura automáticamenteDJANGO_SETTINGS_MODULEla variable de entorno apuntando a la configuración del proyecto actual. Todos los comandos de gestión del proyecto se ejecutan a través de él, como:
- runserver: Iniciar el servidor de desarrollo
- makemigrations: Generar archivos de migración de base de datos
- shell: Iniciar el shell de Python con ORM
db.sqlite3El archivo de base de datos SQLite que Django usa por defecto, tras la primera ejecución delmigratecomando, se genera automáticamente. Adecuado para el entorno de desarrollo; en producción se recomienda usar PostgreSQL/MySQL. La ubicación del archivo está definida porsettings.pyenDATABASES['default']['NAME'].
__pycache__/Directorio de caché de código de bytes generado por el intérprete de Python, que contiene archivos.pyc, utilizados para acelerar la carga de módulos. No es necesario enviarlos al control de versiones (debe ignorarse en.gitignore).


Análisis de los archivos principales

manage.py

manage.pyEs la entrada de la herramienta de línea de comandos del proyecto Django, que ofrece muchos comandos útiles:

Ejemplo

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
    try:
        from django.core.management import execute_from_command_line
    except ImportError:
        # Manejar errores de importación
        pass
    execute_from_command_line(sys.argv)

Ejemplos de comandos comunes:

  • python manage.py runserver- Iniciar el servidor de desarrollo
  • python manage.py migrate- Aplicar migraciones de base de datos
  • python manage.py createsuperuser- Crear cuenta de administrador

settings.py

settings.pyEs el archivo de configuración del proyecto Django, que contiene todos los ajustes importantes:

Ejemplo

# Explicación detallada de los elementos de configuración clave:
DEBUG = True  # En desarrollo, establecer a True para mostrar errores detallados; en producción debe cambiarse a False
ALLOWED_HOSTS = []  # Cuando DEBUG=False, se debe especificar el dominio permitido (por ejemplo, ['example.com'])

INSTALLED_APPS = [
    'django.contrib.admin',    # Administración del sitio
    'django.contrib.auth',     # Sistema de autenticación
    'django.contrib.contenttypes',  # Marco de tipos de contenido
    'django.contrib.sessions', # Gestión de sesiones
    'django.contrib.messages', # Marco de mensajes
    'django.contrib.staticfiles',  # Gestión de archivos estáticos
    # Se pueden añadir aplicaciones personalizadas: 'myapp.apps.MyAppConfig'
]

DATABASES = {  # Configuración de base de datos
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',  # Usar la sintaxis pathlib
        # Ejemplo con MySQL:
        # 'ENGINE': 'django.db.backends.mysql',
        # 'NAME': 'mydb',
        # 'USER': 'root',
        # 'PASSWORD': 'password',
    }
}

STATIC_URL = '/static/'  # Prefijo de URL de archivos estáticos
STATICFILES_DIRS = [BASE_DIR / 'static']  # Directorios de búsqueda de archivos estáticos en desarrollo
MEDIA_URL = '/media/'   # Prefijo de URL para archivos subidos por el usuario
MEDIA_ROOT = BASE_DIR / 'media'  # Ruta de almacenamiento de archivos subidos

urls.py (Centro de despacho de URL)

Ejemplo

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),  # Ruta del administrador
    path('blog/', include('blog.urls')),  # Distribución de rutas de subaplicaciones
    # path('api/', include('api.urls', namespace='api')),
]
  • include(): Implementa la modularización de rutas, separando las rutas de las diferentes aplicaciones en sus propios archivos urls.py.
  • namespace: Se utiliza para evitar conflictos de nombres al resolver URLs de forma inversa.

wsgi.py & asgi.py

ArchivoPropósito
wsgi.pyConfiguración WSGI (Web Server Gateway Interface), utilizada para servidores síncronos tradicionales (como Gunicorn, uWSGI). En producción, el proyecto se inicia a través de este archivo.
asgi.pyConfiguración ASGI (Asynchronous Server Gateway Interface), compatible con servidores asíncronos (como Daphne, Uvicorn). Se utiliza para WebSocket o vistas asíncronas.

Directorios extendidos (no se generan automáticamente, pero son de uso común)

HelloWorld/
├── apps/               # 推荐:存放所有自定义应用
│   └── blog/          # 示例应用
├── static/             # 静态文件(CSS/JS/图片)
├── media/              # 用户上传文件
├── templates/          # 全局模板目录
└── requirements.txt    # 项目依赖列表

1. Directorio apps/ (estructura recomendada)

Gestiona las aplicaciones de forma centralizada, evitando que se dispersen en el directorio raíz del proyecto.

Es necesario configurar la ruta de Python en settings.py:

import sys
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

2. Archivos estáticos y archivos multimedia

  • static/: Almacena CSS, JavaScript, imágenes, etc., accesibles a través de STATIC_URL.

  • media/: Archivos subidos por el usuario (como avatares), accesibles a través de MEDIA_URL. Se debe configurar el servidor para proporcionar acceso en desarrollo:

    # urls.py(仅开发环境)
    from django.conf import settings
    from django.conf.urls.static import static
    
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Estructura de aplicaciones de Django

En Django, un proyecto puede contener múltiples aplicaciones. Usandopython manage.py startapp myappAl crear una nueva aplicación, se genera la siguiente estructura:

myapp/
│
├── migrations/
│   └── __init__.py
├── __init__.py
├── admin.py
├── apps.py
├── models.py
├── tests.py
└── views.py

Archivos principales de la aplicación

models.py

Define los modelos de datos, correspondientes a las tablas de la base de datos:

Ejemplo

from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    description = models.TextField()
   
    def __str__(self):
        return self.name

views.py

Maneja la lógica de negocio y devuelve respuestas:

Ejemplo

from django.shortcuts import render
from .models import Product

def product_list(request):
    products = Product.objects.all()
    return render(request, 'myapp/product_list.html', {'products': products})

admin.py

Configura el panel de administración de Django:

Ejemplo

from django.contrib import admin
from .models import Product

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    list_display = ('name', 'price')

Ejemplo de estructura completa del proyecto

La estructura completa de un proyecto Django típico es la siguiente:

myproject/
│
├── manage.py
├── requirements.txt
├── static/
│   ├── css/
│   ├── js/
│   └── images/
├── media/
├── templates/
│   └── base.html
└── myproject/
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    ├── wsgi.py
    └── asgi.py
└── myapp1/
    ├── migrations/
    ├── templates/
    │   └── myapp1/
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── models.py
    ├── tests.py
    ├── urls.py
    └── views.py
└── myapp2/
    └── ... (类似结构)

Explicación de directorios importantes

Directorio migrations

Almacena los archivos de migración de la base de datos; Django los utiliza para rastrear los cambios en los modelos y sincronizarlos con la base de datos.

Directorio static

Almacena archivos estáticos (CSS, JavaScript, imágenes, etc.), que se recopilan en una ubicación específica durante el despliegue.

Directorio templates

Almacena archivos de plantilla HTML; Django utiliza el lenguaje de plantillas para generar páginas dinámicamente.

Directorio media

Almacena los archivos subidos por el usuario; es necesario configurarlo en settings.py:

Ejemplo

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Recomendaciones prácticas

  1. Separación de proyectos y aplicaciones: Mantener la independencia de cada aplicación para facilitar su reutilización
  2. Configuración del entorno: Usar diferentes archivos settings para distinguir entre el entorno de desarrollo y el de producción
  3. Gestión de archivos estáticos: En desarrollo, usarSTATICFILES_DIRS; en producción, usarcollectstatic
  4. Diseño de URL: Definir las URLs a nivel de aplicación y luego incluirlas a nivel de proyecto
  5. Organización de plantillas: Crear un subdirectorio para cada aplicación para almacenar las plantillas

Diferencias entre el entorno de producción y el de desarrollo

Archivo/ConfiguraciónEntorno de desarrolloEntorno de producción
DEBUGTrue(Muestra detalles de error)False(Oculta errores, los registra en el log)
Base de datosSQLite (por defecto)PostgreSQL/MySQL (optimización de rendimiento)
Archivos estáticosrunserverServicio automáticoUsarcollectstaticpara recopilar en CDN
ALLOWED_HOSTSLista vacía o['localhost']Debe configurarse el dominio (por ejemplo,['example.com'])
Otras extensiones