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/Directorio | Descripción detallada |
|---|---|
manage.py | Herramienta 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.sqlite3 | El 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
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 desarrollopython manage.py migrate- Aplicar migraciones de base de datospython 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
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.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
| Archivo | Propósito |
|---|---|
wsgi.py | Configuració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.py | Configuració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
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 .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 .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_ROOT = os.path.join(BASE_DIR, 'media')
Recomendaciones prácticas
- Separación de proyectos y aplicaciones: Mantener la independencia de cada aplicación para facilitar su reutilización
- Configuración del entorno: Usar diferentes archivos settings para distinguir entre el entorno de desarrollo y el de producción
- Gestión de archivos estáticos: En desarrollo, usar
STATICFILES_DIRS; en producción, usarcollectstatic - Diseño de URL: Definir las URLs a nivel de aplicación y luego incluirlas a nivel de proyecto
- 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ón | Entorno de desarrollo | Entorno de producción |
|---|---|---|
DEBUG | True(Muestra detalles de error) | False(Oculta errores, los registra en el log) |
| Base de datos | SQLite (por defecto) | PostgreSQL/MySQL (optimización de rendimiento) |
| Archivos estáticos | runserverServicio automático | Usarcollectstaticpara recopilar en CDN |
ALLOWED_HOSTS | Lista vacía o['localhost'] | Debe configurarse el dominio (por ejemplo,['example.com']) |