Desarrollo web con Django
Django es un framework web de Python de alto nivel que fomenta un desarrollo rápido y limpio. Con su filosofía “batteries included”, Django proporciona todo lo que necesitas para construir aplicaciones web robustas y mantenibles.
¿Por qué elegir Django?
Django ofrece numerosas ventajas para el desarrollo web:
- Rápido de desarrollar: Django sigue el principio DRY (Don’t Repeat Yourself) y automatiza muchas tareas
- Seguro por defecto: protección contra las vulnerabilidades web más comunes (XSS, CSRF, inyección SQL…)
- Escalable: utilizado por sitios de alto tráfico como Instagram, Pinterest y Disqus
- Batteries included: ORM integrado, administración automática, sistema de plantillas, autenticación…
- Comunidad activa: documentación excelente y numerosos recursos disponibles
Instalación y configuración
Para empezar con Django, instálalo mediante pip:
# Créer un environnement virtuel
python -m venv venv
source venv/bin/activate # Sur Windows: venv\Scripts\activate
# Installer Django
pip install django
# Créer un nouveau projet
django-admin startproject monsite
# Naviguer vers le projet
cd monsite
# Créer une application
python manage.py startapp blog
Estructura de un proyecto Django
Un proyecto Django típico se organiza de la siguiente manera:
monsite/
manage.py
monsite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
blog/
__init__.py
admin.py
apps.py
models.py
tests.py
views.py
urls.py
migrations/
templates/
blog/
base.html
index.html
detail.html
static/
blog/
css/
js/
images/
Modelos: definir tus datos
Los modelos de Django definen la estructura de tus datos:
# blog/models.py
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class Category(models.Model):
name = models.CharField(max_length=100)
slug = models.SlugField(unique=True)
def __str__(self):
return self.name
class Meta:
verbose_name_plural = "categories"
class Post(models.Model):
STATUS_CHOICES = (
('draft', 'Brouillon'),
('published', 'Publié'),
)
title = models.CharField(max_length=200)
slug = models.SlugField(unique_for_date='publish')
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts')
body = models.TextField()
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='posts')
publish = models.DateTimeField(default=timezone.now)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')
def __str__(self):
return self.title
class Meta:
ordering = ('-publish',)
Después de definir tus modelos, crea y aplica las migraciones:
python manage.py makemigrations
python manage.py migrate
Vistas: la lógica de tu aplicación
Las vistas procesan las peticiones y devuelven respuestas:
# blog/views.py
from django.shortcuts import render, get_object_or_404
from django.core.paginator import Paginator
from .models import Post, Category
def post_list(request, category_slug=None):
posts = Post.objects.filter(status='published')
category = None
if category_slug:
category = get_object_or_404(Category, slug=category_slug)
posts = posts.filter(category=category)
paginator = Paginator(posts, 10) # 10 posts par page
page = request.GET.get('page')
posts = paginator.get_page(page)
return render(request, 'blog/post_list.html', {
'posts': posts,
'category': category
})
def post_detail(request, year, month, day, post_slug):
post = get_object_or_404(
Post,
slug=post_slug,
status='published',
publish__year=year,
publish__month=month,
publish__day=day
)
return render(request, 'blog/post_detail.html', {'post': post})
URLs: enrutamiento de las peticiones
Configura las URLs para dirigir las peticiones a las vistas adecuadas:
# blog/urls.py
from django.urls import path
from . import views
app_name = 'blog'
urlpatterns = [
path('', views.post_list, name='post_list'),
path('category/<slug:category_slug>/', views.post_list, name='post_list_by_category'),
path('<int:year>/<int:month>/<int:day>/<slug:post_slug>/', views.post_detail, name='post_detail'),
]
# monsite/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls', namespace='blog')),
]
Plantillas: la interfaz de usuario
Las plantillas definen cómo se presentan los datos:
<!-- blog/templates/blog/base.html -->
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}Mon Blog{% endblock %}</title>
<link rel="stylesheet" href="{% static 'blog/css/style.css' %}">
</head>
<body>
<header>
<h1>Mon Blog</h1>
<nav>
<ul>
<li><a href="{% url 'blog:post_list' %}">Accueil</a></li>
{% for cat in categories %}
<li><a href="{% url 'blog:post_list_by_category' cat.slug %}">{{ cat.name }}</a></li>
{% endfor %}
</ul>
</nav>
</header>
<main>
{% block content %}
{% endblock %}
</main>
<footer>
<p>© {% now "Y" %} Mon Blog</p>
</footer>
</body>
</html>
<!-- blog/templates/blog/post_list.html -->
{% extends "blog/base.html" %}
{% block title %}
{% if category %}{{ category.name }}{% else %}Articles{% endif %}
{% endblock %}
{% block content %}
<h2>
{% if category %}
Articles dans la catégorie "{{ category.name }}"
{% else %}
Tous les articles
{% endif %}
</h2>
{% for post in posts %}
<article>
<h3><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h3>
<p class="date">Publié le {{ post.publish }} par {{ post.author }}</p>
<p>{{ post.body|truncatewords:30|linebreaks }}</p>
</article>
{% empty %}
<p>Aucun article disponible.</p>
{% endfor %}
{% include "pagination.html" with page=posts %}
{% endblock %}
Administración de Django
Django proporciona una interfaz de administración lista para usar:
# blog/admin.py
from django.contrib import admin
from .models import Category, Post
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
list_display = ('name', 'slug')
prepopulated_fields = {'slug': ('name',)}
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ('title', 'slug', 'author', 'publish', 'status')
list_filter = ('status', 'created', 'publish', 'author')
search_fields = ('title', 'body')
prepopulated_fields = {'slug': ('title',)}
raw_id_fields = ('author',)
date_hierarchy = 'publish'
ordering = ('status', 'publish')
Lanzar el servidor de desarrollo
Para probar tu aplicación:
python manage.py runserver
Accede a http://127.0.0.1:8000/ en tu navegador.
Funcionalidades avanzadas
Django ofrece numerosas funcionalidades avanzadas:
- Autenticación: sistema completo de gestión de usuarios
- Formularios: creación, validación y procesamiento de formularios
- Pruebas: framework de pruebas integrado
- Internacionalización: soporte multilingüe
- Caché: varios niveles de almacenamiento en caché
- Seguridad: protección contra los ataques más comunes
Despliegue
Para desplegar una aplicación Django en producción:
- Configurar los parámetros de producción en
settings.py - Recopilar los archivos estáticos:
python manage.py collectstatic - Elegir un servidor WSGI como Gunicorn o uWSGI
- Configurar un servidor web como Nginx o Apache
- Utilizar una base de datos robusta como PostgreSQL
Conclusión
Django es un framework potente que te permite construir rápidamente aplicaciones web complejas y seguras. Su filosofía “batteries included” y su estructura bien organizada lo convierten en una excelente opción para los desarrolladores de Python que desean crear sitios web robustos y mantenibles.
Tanto si construyes un simple blog, un sitio de comercio electrónico o una aplicación web compleja, Django te proporciona las herramientas necesarias para que tu proyecto sea un éxito.
Acerca de InSkillCoach
Experto en formación y tecnologías
Coach especializado en tecnologías avanzadas e IA, impulsado por GNeurone Inc.
Certificaciones:
- AWS Certified Solutions Architect – Professional
- Certificaciones de Google Cloud
- Microsoft Certified: DevOps Engineer Expert
- Certified Kubernetes Administrator (CKA)
- CompTIA Security+
Comentarios
Los comentarios funcionan con GitHub Discussions
Inicia sesión con GitHub para participar en la discusión