En aquest tema, aprendrem com optimitzar el rendiment de les aplicacions Django per assegurar-nos que siguin ràpides i eficients. Tractarem diverses tècniques i eines que ens ajudaran a millorar la velocitat i la capacitat de resposta de les nostres aplicacions.

  1. Cache

1.1. Tipus de Cache

Django ofereix diverses opcions de cache que podem utilitzar per millorar el rendiment de les nostres aplicacions:

  • Memcached: Un sistema de cache distribuït que emmagatzema dades en memòria RAM per a un accés ràpid.
  • Redis: Un magatzem de dades en memòria que pot actuar com a cache, base de dades i intermediari de missatges.
  • File-based Cache: Emmagatzema les dades de cache en fitxers al sistema de fitxers.

1.2. Configuració de Cache

A continuació, es mostra un exemple de configuració de cache utilitzant Memcached:

# settings.py

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}

1.3. Utilització de Cache

Podem utilitzar la cache per emmagatzemar resultats de consultes costoses o pàgines senceres. Aquí teniu un exemple de com cachejar una vista:

# views.py

from django.views.decorators.cache import cache_page
from django.shortcuts import render

@cache_page(60 * 15)  # Cacheja la pàgina durant 15 minuts
def my_view(request):
    # Codi de la vista
    return render(request, 'my_template.html')

  1. Consultes Eficients amb Django ORM

2.1. Utilització de select_related i prefetch_related

Aquestes funcions ens permeten reduir el nombre de consultes a la base de dades quan treballem amb relacions entre models.

  • select_related: Utilitzat per a relacions de tipus ForeignKey i OneToOne.
  • prefetch_related: Utilitzat per a relacions de tipus ManyToMany i ForeignKey inverses.
# Exemple d'ús de select_related
books = Book.objects.select_related('author').all()

# Exemple d'ús de prefetch_related
authors = Author.objects.prefetch_related('books').all()

2.2. Utilització de only i defer

Aquestes funcions ens permeten carregar només els camps necessaris dels models, reduint així la quantitat de dades transferides.

# Exemple d'ús de only
books = Book.objects.only('title', 'author').all()

# Exemple d'ús de defer
books = Book.objects.defer('description').all()

  1. Optimització de Plantilles

3.1. Utilització de Plantilles Cachejades

Podem utilitzar la cache per emmagatzemar fragments de plantilles que no canvien freqüentment.

{% load cache %}
{% cache 500 sidebar %}
    <!-- Contingut de la barra lateral -->
{% endcache %}

3.2. Minificació de Fitxers Estàtics

Minificar els fitxers CSS i JavaScript pot reduir el temps de càrrega de les pàgines. Django ofereix el paquet django-compressor per a aquesta tasca.

# settings.py

INSTALLED_APPS = [
    ...
    'compressor',
]

STATICFILES_FINDERS = [
    ...
    'compressor.finders.CompressorFinder',
]

  1. Optimització de la Base de Dades

4.1. Índexs de Base de Dades

Crear índexs en els camps que s'utilitzen freqüentment en les consultes pot millorar significativament el rendiment.

# models.py

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200, db_index=True)
    author = models.ForeignKey(Author, on_delete=models.CASCADE, db_index=True)

4.2. Anàlisi de Consultes

Utilitzar eines com django-debug-toolbar per analitzar les consultes SQL generades per Django i identificar colls d'ampolla.

# settings.py

INSTALLED_APPS = [
    ...
    'debug_toolbar',
]

MIDDLEWARE = [
    ...
    'debug_toolbar.middleware.DebugToolbarMiddleware',
]

  1. Altres Tècniques d'Optimització

5.1. Utilització de Middleware Eficient

Evitar l'ús de middleware innecessari i assegurar-se que el middleware utilitzat sigui eficient.

5.2. Compressió de Respostes HTTP

Utilitzar la compressió Gzip per reduir la mida de les respostes HTTP.

# settings.py

MIDDLEWARE = [
    ...
    'django.middleware.gzip.GZipMiddleware',
]

5.3. Utilització de CDN per a Fitxers Estàtics

Utilitzar una Xarxa de Distribució de Continguts (CDN) per servir fitxers estàtics pot millorar significativament el temps de càrrega de les pàgines.

Exercicis Pràctics

Exercici 1: Implementació de Cache

Configura la cache en el teu projecte Django utilitzant Redis i cacheja una vista que mostra una llista d'articles.

Exercici 2: Optimització de Consultes

Utilitza select_related i prefetch_related per optimitzar les consultes en una vista que mostra una llista de llibres amb els seus autors.

Exercici 3: Minificació de Fitxers Estàtics

Configura django-compressor per minificar els fitxers CSS i JavaScript en el teu projecte.

Solucions

Solució a l'Exercici 1

# settings.py

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        }
    }
}

# views.py

from django.views.decorators.cache import cache_page
from django.shortcuts import render
from .models import Article

@cache_page(60 * 15)  # Cacheja la pàgina durant 15 minuts
def article_list(request):
    articles = Article.objects.all()
    return render(request, 'article_list.html', {'articles': articles})

Solució a l'Exercici 2

# views.py

from django.shortcuts import render
from .models import Book

def book_list(request):
    books = Book.objects.select_related('author').all()
    return render(request, 'book_list.html', {'books': books})

Solució a l'Exercici 3

# settings.py

INSTALLED_APPS = [
    ...
    'compressor',
]

STATICFILES_FINDERS = [
    ...
    'compressor.finders.CompressorFinder',
]

# templates/base.html

{% load compress %}
<!DOCTYPE html>
<html>
<head>
    {% compress css %}
    <link rel="stylesheet" href="{% static 'css/style.css' %}">
    {% endcompress %}
</head>
<body>
    ...
    {% compress js %}
    <script src="{% static 'js/script.js' %}"></script>
    {% endcompress %}
</body>
</html>

Conclusió

En aquesta secció, hem après diverses tècniques per optimitzar el rendiment de les aplicacions Django, incloent l'ús de cache, l'optimització de consultes, la minificació de fitxers estàtics i la compressió de respostes HTTP. Implementar aquestes tècniques pot ajudar a millorar significativament la velocitat i l'eficiència de les nostres aplicacions.

© Copyright 2024. Tots els drets reservats