如何在 Django 中移除 DEBUG URL 的靜態檔案配置

更新日期: 2025 年 1 月 20 日

在 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 文件。

測試檔案上傳與訪問

  1. 啟動 Django 開發伺服器: python manage.py runserver
  2. 上傳一個檔案(例如圖片)。
  3. 確認該檔案是否成功存儲到 S3,並檢查生成的 URL 是否正確指向 S3: https://your-bucket-name.s3.amazonaws.com/media/your-uploaded-file.jpg

結論與最佳實踐

核心改動回顧

  • 移除 static() 配置:避免 Django 嘗試從本地存儲提供檔案。
  • 確保 S3 配置正確:通過 DEFAULT_FILE_STORAGEMEDIA_URL,Django 自動將文件上傳並指向 S3。

為什麼這樣做?

  • 減少混淆:開發與生產環境統一使用 S3 作為媒體存儲後端。
  • 提高穩定性:避免文件存儲位置的錯誤配置導致的訪問問題。

通過以上步驟,你的 Django 應用將更簡潔高效地運行,並充分利用 AWS S3 的能力。

Similar Posts