本文將介紹 Django 4.1 如何根據不同環境(開發、測試、生產)進行自定義配置。
注意: 敏感文件於下篇介紹,本文著重於各環境配置核心。
分層結構化的設定文件
將 settings.py
視需求拆分,此指南範例為 base.py
、dev.py
、prod.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)
結語
透過分層的配置結構,好處包括提高配置的可維護性、安全性、快速環境配置的切換和簡化部屬過程,達到高效率因應開發、測試、生產各階段的配置需求。