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