文章

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 授權

Comments powered by Disqus.