Django 4 多環境配置指南

Django 4 多環境配置指南

環境配置從基本結構到多環境結構的設定方式

本文將介紹 Django 4.1 如何根據不同環境(開發、測試、生產)進行自定義配置。

注意: 敏感文件於下篇介紹,本文著重於各環境配置核心。

分層結構化的設定文件

settings.py 視需求拆分,此指南範例為 base.pydev.pyprod.py

以下是多環境分層後的 Django 專案資料夾結構樹:

my_django_project/
│
├── my_app/
│   ├── __init__.py
│   ├── models.py
│   ├── views.py
│   └── ...
│
├── prj_dept/
│   ├── __init__.py
│   ├── settings/
│   │   ├── __init__.py
│   │   ├── base.py
│   │   ├── dev.py
│   │   └── prod.py
│   ├── urls.py
│   └── wsgi.py
│
├── .env.dev
├── .env.test
├── .env.prod
├── .gitignore
├── manage.py
└── requirements.txt

指定自定義配置文件的運行命令

  • 開發環境為例:

      python manage.py runserver --settings=settings.dev
    

不同環境配置的重點

基礎設置(base.py)

環境共享的基礎設置。

  • Django 項目的核心設置,數據庫配置、中間件和模板設置和確定每個環境會使用到的服務。

      # base.py
      import os.path
      from pathlib import Path
    
      BASE_DIR = Path(__file__).resolve().parent.parent
      TEMPLATE_DIR = Path.joinpath(BASE_DIR, 'templates')  # 模板路徑設置
    
      MIDDLEWARE = [
          # ...
      ]
    
      # 其他共享設置...
    

開發環境(dev.py)

用於開發和初步測試,配置有便於開發者調試和快速迭代的工具。

  • 開啟調試模式(DEBUG = True),提供詳細隱私數據方便除錯。

  • 配置本地開發專用的數據庫。

  • ALLOWED_HOSTS 指定域名的請求才會被 Django 處理。

    • 在開發環境中,為了方便通常會設置為萬字符 ALLOWED_HOSTS = ['*'],這表示接受來自任何主機的請求
  • 安裝調試工具,例如 Django Debug Toolbar,將應用程序添加到 INSTALLED_APPS 列表的末尾。

  • 添加中間件

      # dev.py
      from .base import *
    
      # 調試設置
      DEBUG = True
      # 數據庫配置
      DATABASES = {
          'default': {
              # 數據庫配置
          }
      }
    
      INSTALLED_APPS += ['debug_toolbar']
      # 中間件放在最開頭
      MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware'] + MIDDLEWARE
    
      ALLOWED_HOSTS='*'
    
      # 其他開發特定設置...
    

測試環境(test.py,若有)

與生產環境盡可能相似,但可能包含額外的測試工具。

  • 進行更徹底的測試,包括性能測試、安全測試等。

  • 配置測試專用數據庫和測試工具。

生產環境(prod.py)

用於實際運行和服務用戶,配置確保應用其安全性、穩定性和高效性的工具和措施。

  • 關閉調試模式(DEBUG = False),避免敏感數據外洩。

  • 使用生產級數據庫配置,例如,在 Docker 容器中以非 root 用戶運行應用程序,以提高安全性。

  • ALLOWED_HOSTS 將萬字符修改成指定域名。

  • 靜態文件和媒體文件設置,例如,可能使用 Amazon S3、Google Cloud Storage 或等其他服務。

      # prod.py
      from .base import *
    
      # 調試設置
      DEBUG = False
      # 允許請求的域名
      ALLOWED_HOSTS = ['yourdomain.com', 'www.yourdomain.com']
      # 數據庫配置
      DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.mysql',
              'NAME': 'your_db_name', # 使用非 root 名
              'USER': 'your_db_user',
              'PASSWORD': 'your_db_password',
              'HOST': 'your_db_host',  # 使用 Docker 服務名稱
              'PORT': 'your_db_port',
          }
      }
    
      # 處理靜態文件和媒體文件
      STATIC_URL = '/static/'
      STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    
      MEDIA_URL = '/media/'
      MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    
      # 其他生產環境相關設置...
    
      INSTALLED_APPS += [ ... ]
    

URL 配置(urls.py)和調試工具

根據不同的環境配置不同的路徑和工具。

  • 透過 if settings.DEBUG 允許只在開發環境中,加入 Django Debug Toolbar 和 API 文檔生成工具,如 Swagger 和 ReDoc。

      # urls.py
      from django.conf import settings
      from django.urls import path, include
      from django.conf.urls.static import static
    
      urlpatterns = [
          # ...
      ]
    
      # 調試工具路徑
      if settings.DEBUG:
          urlpatterns += [
              path('__debug__/', include('debug_toolbar.urls')),
              path('swagger<format>/', schema_view.without_ui(cache_timeout=0), name='schema-json'),
              path('swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
              path('redoc/', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
          ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    

結語

透過分層的配置結構,好處包括提高配置的可維護性、安全性、快速環境配置的切換和簡化部屬過程,達到高效率因應開發、測試、生產各階段的配置需求。