文章

Django - 專案優化與回顧

在完成應用的基本功能與部署後,我們需要對整個專案進行最後的優化與回顧,以確保應用的穩定性、高效性及可維護性。本節課程將涵蓋性能調整、安全性強化、代碼重構,以及專案開發過程的總結與心得分享。


課程目標

  1. 深入學習應用性能調整的方法,包括數據庫優化與查詢分析。
  2. 強化應用安全性,應對常見安全威脅。
  3. 進行代碼重構與清理,提高專案的可讀性與可維護性。
  4. 回顧整個專案的開發流程,分析改進空間,提升開發技能。

課程內容

1. 性能優化

查詢效率優化

使用 Django 的 QuerySet 方法優化資料庫查詢:

  • 使用 select_relatedprefetch_related

    1
    2
    3
    4
    5
    
    # 減少查詢次數,使用 select_related
    posts = Post.objects.select_related('author').all()
    
    # 預取關聯對象,適合多對多查詢
    tags = Tag.objects.prefetch_related('posts').all()
    
  • 避免 N+1 問題: 減少重複查詢:

    1
    2
    
    for post in Post.objects.all():
        print(post.author.name)  # 沒有 select_related 時會發生 N+1 問題
    

使用資料庫索引

為常用查詢的欄位添加索引:

1
2
3
4
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200, db_index=True)  # 添加索引

分析查詢性能

啟用 Django Debug Toolbar 分析查詢性能:

1
pip install django-debug-toolbar

settings.py 中配置:

1
2
3
4
INSTALLED_APPS += ['debug_toolbar']
MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware'] + MIDDLEWARE

INTERNAL_IPS = ['127.0.0.1']

2. 安全性優化

1. CSRF 防護

確保所有表單和 API 都啟用 CSRF 防護(Django 默認啟用)。對於 REST API,可使用 CSRF_COOKIE

1
2
# settings.py
CSRF_COOKIE_HTTPONLY = True

2. HTTPS

強制使用 HTTPS,確保數據傳輸安全:

1
2
3
4
5
6
7
# settings.py
SECURE_SSL_REDIRECT = True
SECURE_HSTS_SECONDS = 3600
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SECURE_BROWSER_XSS_FILTER = True
SECURE_CONTENT_TYPE_NOSNIFF = True

3. 避免 SQL 注入

使用參數化查詢:

1
2
3
4
from django.db import connection

cursor = connection.cursor()
cursor.execute("SELECT * FROM my_table WHERE id = %s", [user_input])

4. 資料加密

敏感數據如密碼應使用散列存儲,Django 預設使用 pbkdf2 散列算法。


3. 代碼重構

清理未使用的代碼

使用工具如 flake8pylint 檢查代碼中的未使用部分:

1
2
3
pip install flake8 pylint
flake8 myproject/
pylint myproject/

模組化代碼

將複雜的視圖或業務邏輯移至服務層或工具函數中:

1
2
3
# services/post_service.py
def get_recent_posts(limit=10):
    return Post.objects.order_by('-created_at')[:limit]

在視圖中調用:

1
2
3
4
5
6
from services.post_service import get_recent_posts

class PostListView(APIView):
    def get(self, request):
        posts = get_recent_posts()
        return Response({'posts': posts})

撰寫詳細註解與文檔

對重要模組、函數與 API 添加註解,並使用 Sphinx 生成文檔。


4. 回顧與總結

專案開發流程

  1. 需求分析:初步確定專案的功能與範圍。
  2. 設計架構:選擇框架(如 Django)、數據庫(如 PostgreSQL),規劃前後端分離架構。
  3. 開發過程

    • 採用敏捷開發迭代方式,每個功能模組完成後進行測試。
    • 使用 Git 進行版本控制與分支管理。
  4. 部署與測試:確保生產環境配置與測試足夠穩定。
  5. 優化與維護:通過性能測試與安全性檢查進行持續改進。

課堂練習

  1. 使用 Django Debug Toolbar 找出專案中存在的性能瓶頸,並進行優化。
  2. 將專案的核心功能模組化,撰寫詳細的服務層函數。
  3. 測試應用的安全性,模擬 CSRF、XSS 等攻擊場景,並進行修正。

作業

  1. 使用 Docker 部署優化後的應用,並確保應用的啟動與運行穩定。
  2. 撰寫專案的完整文檔,包括功能介紹、API 說明與使用指南。
  3. 分析專案開發過程中存在的問題,總結改進措施,並對未來專案的開發提出建議。

本文章以 CC BY 4.0 授權