Django - 性能優化
性能優化是 Django 應用進入生產環境後非常重要的一個環節,目的是提高應用的響應速度、處理能力以及資源使用效率。本節將介紹 Django 應用的性能優化策略和實踐。
課程目標
- 瞭解性能優化的重要性與基本原則。
- 學習如何優化數據庫查詢和視圖性能。
- 探索緩存技術在 Django 中的應用。
- 配置壓縮與靜態資源優化。
- 瞭解應用監控和瓶頸分析工具。
課程內容
1. 性能優化基本原則
- 減少延遲:盡量減少外部請求和資源加載時間。
- 避免重複操作:使用緩存存儲經常查詢的數據。
- 分擔負載:將耗時操作交給後台處理。
- 監控性能:使用性能監控工具發現瓶頸。
2. 優化數據庫查詢
步驟 1:使用 QuerySet 方法
Django 提供多種查詢優化方法,例如:
select_related
和prefetch_related
:減少查詢次數。only
和defer
:只獲取必要字段。annotate
和aggregate
:在數據庫中執行計算。
範例:
1
2
3
4
5
# 使用 select_related 減少多次查詢
books = Book.objects.select_related('author').all()
# 只獲取必要字段
books = Book.objects.only('title', 'author')
步驟 2:避免 N+1 查詢問題
對外鍵或多對多字段使用適當的查詢優化策略。
3. 視圖性能優化
步驟 1:使用裝飾器處理緩存
為視圖添加緩存:
1
2
3
4
5
from django.views.decorators.cache import cache_page
@cache_page(60 * 15) # 緩存 15 分鐘
def my_view(request):
...
步驟 2:減少數據處理時間
避免在視圖中進行大量計算或數據處理,可以將這些操作交給後台任務(例如 Celery)。
4. 緩存技術
步驟 1:啟用 Django 緩存框架
在 settings.py
中配置緩存:
1
2
3
4
5
6
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
}
}
步驟 2:使用緩存 API
手動緩存數據:
1
2
3
4
5
6
7
from django.core.cache import cache
# 設置緩存
cache.set('my_key', 'my_value', timeout=60)
# 獲取緩存
value = cache.get('my_key')
5. 靜態資源與壓縮
步驟 1:啟用 Gzip 壓縮
在 Nginx 配置中啟用 Gzip 壓縮:
1
2
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
步驟 2:使用 CDN
使用 CDN 儲存並分發靜態資源(如圖片、CSS、JS),減少伺服器負載。
步驟 3:優化靜態文件
使用工具(如 django-compressor
)壓縮和合併 CSS 和 JS:
1
pip install django-compressor
在 settings.py
中添加:
1
2
INSTALLED_APPS += ['compressor']
STATICFILES_FINDERS += ['compressor.finders.CompressorFinder']
在模板中:
1
2
3
{% load compress %} {% compress css %}
<link rel="stylesheet" href="{% static 'style.css' %}" />
{% endcompress %}
6. 異步處理
步驟 1:使用 Celery 和 Redis
將耗時的任務(如發送郵件)交給 Celery 處理:
1
2
3
4
@shared_task
def send_email_task(email):
# 發送郵件邏輯
...
步驟 2:使用 Django 的異步視圖
在支持 Django 3.1 或更高版本的項目中,可以使用異步視圖:
1
2
3
4
5
from django.http import JsonResponse
async def async_view(request):
# 異步操作
return JsonResponse({'status': 'ok'})
7. 性能監控與分析
工具推薦
- Django Debug Toolbar:開發階段查看 SQL 查詢和性能瓶頸。
- New Relic:生產環境性能監控。
- Sentry:錯誤跟蹤和性能分析。
安裝 Django Debug Toolbar
1
pip install django-debug-toolbar
在 settings.py
中:
1
2
3
4
INSTALLED_APPS += ['debug_toolbar']
MIDDLEWARE += ['debug_toolbar.middleware.DebugToolbarMiddleware']
INTERNAL_IPS = ['127.0.0.1']
課堂練習
- 優化 Day 7 的 Blog 系統:
- 減少視圖中的數據庫查詢次數。
- 使用緩存存儲熱門文章。
- 為靜態資源啟用 Gzip 壓縮和 CDN 儲存。
作業
- 使用 Celery 為 Blog 系統添加訂閱通知功能。
- 嘗試在生產環境中配置 Redis 緩存並測試效果。
- 使用性能監控工具分析應用的瓶頸並撰寫優化報告。
本文章以 CC BY 4.0 授權