Sobes.tech
Middle

Explica cómo se procesa una solicitud HTTP en Django.

sobes.tech AI

Respuesta de la IA

El procesamiento de una solicitud HTTP en Django incluye varias etapas principales:

  1. Servidor WSGI: La solicitud llega al servidor WSGI (por ejemplo, Gunicorn, uWSGI), que es la interfaz estándar entre los servidores web y las aplicaciones web en Python.
  2. wsgi.py: El servidor WSGI pasa la solicitud a la aplicación Django a través del archivo wsgi.py, generalmente ubicado en el directorio raíz del proyecto. Este archivo contiene el objeto WSGI de la aplicación.
    # wsgi.py
    import os
    
    from django.core.wsgi import get_wsgi_application
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<your_project>.settings')
    
    application = get_wsgi_application() # Objeto WSGI de la aplicación
    
  3. Middleware: La solicitud pasa a través de una cadena de middleware configurados. Middleware es una capa de software que procesa las solicitudes y respuestas. Pueden realizar autenticación, gestión de sesiones, procesamiento de encabezados y otras funciones.
    # settings.py
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        # Tus middleware personalizados
    ]
    
  4. Resolutor de URL (urls.py): Después de pasar por middleware, Django determina qué vista debe manejar la solicitud, basándose en las plantillas de URL definidas en urls.py del proyecto.
    # urls.py (nivel del proyecto)
    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('my_app/', include('<my_app>.urls')), # Inclusión de URLs de la aplicación
    ]
    
    
    # urls.py (nivel de la aplicación)
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('', views.index, name='index'),
        path('item/<int:item_id>/', views.detail, name='detail'),
    ]
    
  5. Vista: La plantilla de URL encontrada está vinculada a una función o clase de vista específica. La función de vista (o método de una vista basada en clases) recibe un objeto HttpRequest como argumento y contiene la lógica para procesar la solicitud.
    # views.py
    from django.shortcuts import render, get_object_or_404
    from .models import Item
    
    def index(request):
        items = Item.objects.all()
        return render(request, 'my_app/index.html', {'items': items})
    
    def detail(request, item_id):
        item = get_object_or_404(Item, pk=item_id)
        return render(request, 'my_app/detail.html', {'item': item})
    
  6. Modelo (opcional): La vista puede interactuar con modelos (API a la base de datos Django ORM) para obtener o guardar datos.
    # models.py
    from django.db import models
    
    class Item(models.Model):
        name = models.CharField(max_length=100)
        description = models.TextField()
    
        def __str__(self):
            return self.name
    
  7. Plantilla (opcional): La vista puede usar plantillas de Django para generar la respuesta HTML.
    <!-- my_app/templates/my_app/index.html -->
    <h1>Items</h1>
    <ul>
    {% for item in items %}
        <li><a href="{% url 'detail' item.id %}">{{ item.name }}</a></li>
    {% endfor %}
    </ul>
    
  8. Respuesta: La vista devuelve un objeto HttpResponse o su subclase (por ejemplo, JsonResponse, RedirectResponse). Este objeto contiene el cuerpo de la respuesta y los encabezados asociados.
  9. Middleware (cadena inversa): El objeto HttpResponse pasa por la cadena inversa a través del mismo middleware que procesó la solicitud. Los middleware pueden modificar la respuesta antes de enviarla al cliente.
  10. Servidor WSGI: La respuesta final se envía al cliente a través del servidor WSGI.