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.
- 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')
- 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()
- Optimització de Plantilles
3.1. Utilització de Plantilles Cachejades
Podem utilitzar la cache per emmagatzemar fragments de plantilles que no canvien freqüentment.
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',
]
- 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',
]
- 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.
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.
Curs de Desenvolupament Web amb Django
Mòdul 1: Introducció a Django
- Què és Django?
- Configuració de l'Entorn de Desenvolupament
- Creació del teu Primer Projecte Django
- Comprensió de l'Estructura del Projecte Django
Mòdul 2: Conceptes Bàsics de Django
- Aplicacions Django i Estructura del Projecte
- Enrutament d'URL i Vistes
- Plantilles i Fitxers Estàtics
- Models i Bases de Dades
- Interfície d'Administració de Django
Mòdul 3: Django Intermedi
Mòdul 4: Django Avançat
- Consultes Avançades amb Django ORM
- Models d'Usuari Personalitzats
- Senyalitzacions de Django
- Proves en Django
- Optimització del Rendiment
