如何在 Django 中移除 DEBUG URL 的靜態檔案配置
更新日期: 2025 年 1 月 20 日
本文為 圖片上傳 AWS S3 系列教學,第 19 篇:
- AWS S3 是什麼?
- boto3 與 django-storages:如何在 Django 中對接 AWS S3
- AWS S3 與 IAM:圖片上傳功能的權限管理指南
- S3 與 Postgres 的比較與應用
- Amazon S3 物件所有權設定解析
- AWS S3「阻止所有公開訪問」設定說明
- Amazon S3 儲存桶版本控制完整指南
- 如何設定 S3 儲存桶的「預設加密」?—— 初學者指南
- S3 儲存桶標籤(Tags)簡單介紹:讓你的 S3 管理更輕鬆!
- AWS S3 物件鎖定功能入門指南
- AWS S3 公開存取權完整指南
- AWS CORS 預檢請求與設定指南
- AWS IAM 設定教學:生成訪問密鑰以用於 S3 配置
- django-storages 基本配置:讓應用程式連接 S3 存儲桶
- Django-storages 的完整配置教學:從隱密性到快取控制
- Django-storages 完整配置指南:從文件存儲到訪問路徑
- Django-storages 配置:環境變數設定
- Django-storages 與 STORAGES 配置:未來相容性的最佳實踐
- 如何在 Django 中移除 DEBUG URL 的靜態檔案配置 👈 所在位置
建議閱讀本文前,先閱讀完 圖片上傳功能 系列文,若閱讀完本文,可以深入閱讀 圖片轉 WebP 功能。
在 Django 開發環境中,static()
函數通常用於提供本地靜態和媒體檔案的路由。
然而,當你使用 AWS S3 作為媒體存儲時,這段代碼已不再需要,並可能導致應用嘗試從本地存儲獲取媒體檔案而非 S3。
本篇文章將介紹如何正確修改 URL 配置,避免潛在的錯誤並確保你的應用程式順利運行。
問題概述
static()
函數的作用
static()
是 Django 提供的開發工具,用於在本地開發環境中從 MEDIA_ROOT
提供靜態或媒體檔案。其主要功能是讓開發者在 DEBUG 模式下方便地測試檔案上傳和訪問。
問題來源
- 在使用 S3 作為媒體存儲後:檔案應直接上傳到 S3,並透過
MEDIA_URL
提供訪問,而非從本地MEDIA_ROOT
提供。 - 衝突行為:如果
urls.py
中仍然保留static()
函數,Django 可能嘗試從本地找尋檔案,導致無法正確訪問上傳到 S3 的檔案。
如何解決這個問題?
移除 URL 配置中的 static()
函數
原始代碼(過時配置)
在開發環境中,你可能會在 urls.py
中添加以下代碼:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
更新後的代碼
當你切換到 S3 作為媒體存儲後,上述代碼已不需要,請將其移除。
更新後的 urls.py
如下:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path("admin/", admin.site.urls),
path("", include("pages.urls")), # 主頁相關的路由
path("users/", include("users.urls")), # 用戶相關的路由
path("order/", include("order.urls")), # 訂單相關的路由
]
確保 settings.py
配置正確
在 settings.py
中,確保已經完成以下設置,讓 Django 正確處理 S3 存儲:
# AWS S3 配置
AWS_ACCESS_KEY_ID = "your-access-key-id"
AWS_SECRET_ACCESS_KEY = "your-secret-access-key"
AWS_STORAGE_BUCKET_NAME = "your-bucket-name"
AWS_S3_REGION_NAME = "ap-southeast-2"
AWS_S3_CUSTOM_DOMAIN = f"{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com"
# 媒體文件配置
MEDIA_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/media/"
DEFAULT_FILE_STORAGE = "storages.backends.s3boto3.S3Boto3Storage"
為什麼可以移除 static()
?
媒體文件的存儲方式
當 DEFAULT_FILE_STORAGE
設定為 storages.backends.s3boto3.S3Boto3Storage
時:
- 上傳的媒體檔案會直接儲存到 S3。
- Django 不再需要從本地
MEDIA_ROOT
提供檔案。
例如,S3 上的文件可以透過以下 URL 訪問:
https://your-bucket-name.s3.amazonaws.com/media/yourfile.jpg
URL 配置的變化
由於 S3 接管了媒體檔案的存儲和訪問,MEDIA_URL
已經指向 S3,因此不再需要使用 static()
配置本地的 URL 路徑。
測試與驗證
修改 URL 配置
按照 2.1 中的說明,移除 static()
配置,並保存 urls.py
文件。
測試檔案上傳與訪問
- 啟動 Django 開發伺服器:
python manage.py runserver
- 上傳一個檔案(例如圖片)。
- 確認該檔案是否成功存儲到 S3,並檢查生成的 URL 是否正確指向 S3:
https://your-bucket-name.s3.amazonaws.com/media/your-uploaded-file.jpg
結論與最佳實踐
核心改動回顧
- 移除
static()
配置:避免 Django 嘗試從本地存儲提供檔案。 - 確保 S3 配置正確:通過
DEFAULT_FILE_STORAGE
和MEDIA_URL
,Django 自動將文件上傳並指向 S3。
為什麼這樣做?
- 減少混淆:開發與生產環境統一使用 S3 作為媒體存儲後端。
- 提高穩定性:避免文件存儲位置的錯誤配置導致的訪問問題。
通過以上步驟,你的 Django 應用將更簡潔高效地運行,並充分利用 AWS S3 的能力。