文章

Django - 性能優化

性能優化是 Django 應用進入生產環境後非常重要的一個環節,目的是提高應用的響應速度、處理能力以及資源使用效率。本節將介紹 Django 應用的性能優化策略和實踐。


課程目標

  1. 瞭解性能優化的重要性與基本原則。
  2. 學習如何優化數據庫查詢和視圖性能。
  3. 探索緩存技術在 Django 中的應用。
  4. 配置壓縮與靜態資源優化。
  5. 瞭解應用監控和瓶頸分析工具。

課程內容

1. 性能優化基本原則

  • 減少延遲:盡量減少外部請求和資源加載時間。
  • 避免重複操作:使用緩存存儲經常查詢的數據。
  • 分擔負載:將耗時操作交給後台處理。
  • 監控性能:使用性能監控工具發現瓶頸。

2. 優化數據庫查詢

步驟 1:使用 QuerySet 方法

Django 提供多種查詢優化方法,例如:

  • select_relatedprefetch_related:減少查詢次數。
  • onlydefer:只獲取必要字段。
  • annotateaggregate:在數據庫中執行計算。

範例:

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']

課堂練習

  1. 優化 Day 7 的 Blog 系統:
    • 減少視圖中的數據庫查詢次數。
    • 使用緩存存儲熱門文章。
  2. 為靜態資源啟用 Gzip 壓縮和 CDN 儲存。

作業

  1. 使用 Celery 為 Blog 系統添加訂閱通知功能。
  2. 嘗試在生產環境中配置 Redis 緩存並測試效果。
  3. 使用性能監控工具分析應用的瓶頸並撰寫優化報告。

本文章以 CC BY 4.0 授權