Django-storages 與 STORAGES 配置:未來相容性的最佳實踐

更新日期: 2024 年 12 月 18 日

隨著 Django 的持續更新,DEFAULT_FILE_STORAGE 設定雖然在 Django 5.1.4 中仍然可用,但已被標記為過時。

新版本推薦使用更靈活且結構化的 STORAGES 設定方式來替代。

這篇文章將帶你了解如何遷移到 STORAGES,並解決與靜態文件相關的問題。


為什麼需要從 DEFAULT_FILE_STORAGE 遷移到 STORAGES

短期影響

目前,DEFAULT_FILE_STORAGE 在 Django 5.1.4 中仍然可以正常使用,但可能會觸發開發工具或 IDE 的過時警告訊息。

這意味著該方法在未來的版本中可能完全被移除。

長期影響

隨著 Django 的演進,繼續使用 DEFAULT_FILE_STORAGE 可能導致:

  • 非相容性問題:升級 Django 版本時應用程式可能無法運行。
  • 技術負債:需要額外的時間和精力進行緊急修正。

為了確保專案的穩定性與可維護性,建議儘早遷移到 STORAGES 設定方式。


如何遷移到 STORAGES

傳統設定:DEFAULT_FILE_STORAGE

在舊版本中,你可能使用以下方式設置媒體文件的存儲:

DEFAULT_FILE_STORAGE = "storages.backends.s3boto3.S3Boto3Storage"

新式設定:STORAGES

使用 STORAGES 可以更靈活地配置媒體文件與靜態文件的存儲方式:

STORAGES = {
    "default": {  # 用於媒體文件
        "BACKEND": "storages.backends.s3boto3.S3Boto3Storage",
        "OPTIONS": {
            "access_key": AWS_ACCESS_KEY_ID,
            "secret_key": AWS_SECRET_ACCESS_KEY,
            "bucket_name": AWS_STORAGE_BUCKET_NAME,
            "region_name": AWS_S3_REGION_NAME,
        },
    },
}

如何配置靜態文件?

在使用 STORAGES 設定時,必須同時指定 staticfiles 的存儲後端,否則可能出現錯誤提示。

選項 1:將靜態文件存儲到 S3

如果希望靜態文件也存儲到 S3,可以在 STORAGES 中新增以下內容:

STORAGES = {
    "default": {  # 媒體文件
        "BACKEND": "storages.backends.s3boto3.S3Boto3Storage",
        "OPTIONS": {
            "access_key": AWS_ACCESS_KEY_ID,
            "secret_key": AWS_SECRET_ACCESS_KEY,
            "bucket_name": AWS_STORAGE_BUCKET_NAME,
            "region_name": AWS_S3_REGION_NAME,
            "default_acl": AWS_DEFAULT_ACL,
            "querystring_auth": AWS_QUERYSTRING_AUTH,
            "object_parameters": AWS_S3_OBJECT_PARAMETERS,
            "custom_domain": AWS_S3_CUSTOM_DOMAIN,
        },
    },
    "staticfiles": {  # 靜態文件
        "BACKEND": "storages.backends.s3boto3.S3Boto3Storage",
        "OPTIONS": {
            "access_key": AWS_ACCESS_KEY_ID,
            "secret_key": AWS_SECRET_ACCESS_KEY,
            "bucket_name": AWS_STORAGE_BUCKET_NAME,
            "region_name": AWS_S3_REGION_NAME,
            "default_acl": AWS_DEFAULT_ACL,
            "querystring_auth": AWS_QUERYSTRING_AUTH,
            "object_parameters": AWS_S3_OBJECT_PARAMETERS,
            "custom_domain": AWS_S3_CUSTOM_DOMAIN,
        },
    },
}
STATIC_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/static/"

選項 2:保留本地存儲

如果希望靜態文件繼續保存在本地,可以設置 staticfiles 為本地存儲:

STORAGES = {
    "default": {  # 媒體文件
        "BACKEND": "storages.backends.s3boto3.S3Boto3Storage",
        "OPTIONS": {
            "access_key": AWS_ACCESS_KEY_ID,
            "secret_key": AWS_SECRET_ACCESS_KEY,
            "bucket_name": AWS_STORAGE_BUCKET_NAME,
            "region_name": AWS_S3_REGION_NAME,
            "default_acl": AWS_DEFAULT_ACL,
            "querystring_auth": AWS_QUERYSTRING_AUTH,
            "object_parameters": AWS_S3_OBJECT_PARAMETERS,
            "custom_domain": AWS_S3_CUSTOM_DOMAIN,
        },
    },
    "staticfiles": {  # 本地靜態文件
        "BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
    },
}
STATIC_URL = "/static/"

設定重點解讀

遷移的改動點

  1. 移除 DEFAULT_FILE_STORAGE
    過去的單一配置方式被替代,取而代之的是更具結構化的 STORAGES 設定。
  2. 新增靜態文件的存儲配置
    STORAGES 中必須明確指定 staticfiles 的後端存儲方式,否則可能導致開發環境或生產環境的錯誤。

遷移的好處

  • 相容未來版本STORAGES 是 Django 的官方推薦方式,能保證未來版本的相容性。
  • 結構清晰:靜態文件與媒體文件的存儲方式分開管理,易於維護和修改。

完整配置範例

以下是基於 S3 的完整 STORAGES 配置範例,涵蓋媒體文件和靜態文件的存儲設定:

from dotenv import load_dotenv
import os

# 加載環境變數
load_dotenv()

AWS_ACCESS_KEY_ID = os.getenv("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.getenv("AWS_SECRET_ACCESS_KEY")
AWS_STORAGE_BUCKET_NAME = os.getenv("AWS_STORAGE_BUCKET_NAME")
AWS_S3_REGION_NAME = os.getenv("AWS_S3_REGION_NAME")
AWS_S3_CUSTOM_DOMAIN = f"{AWS_STORAGE_BUCKET_NAME}.s3.{AWS_S3_REGION_NAME}.amazonaws.com"

AWS_DEFAULT_ACL = None
AWS_QUERYSTRING_AUTH = False
AWS_S3_OBJECT_PARAMETERS = {"CacheControl": "max-age=86400"}

MEDIA_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/media/"
STATIC_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/static/"

STORAGES = {
    "default": {  # 媒體文件
        "BACKEND": "storages.backends.s3boto3.S3Boto3Storage",
        "OPTIONS": {
            "access_key": AWS_ACCESS_KEY_ID,
            "secret_key": AWS_SECRET_ACCESS_KEY,
            "bucket_name": AWS_STORAGE_BUCKET_NAME,
            "region_name": AWS_S3_REGION_NAME,
            "default_acl": AWS_DEFAULT_ACL,
            "querystring_auth": AWS_QUERYSTRING_AUTH,
            "object_parameters": AWS_S3_OBJECT_PARAMETERS,
            "custom_domain": AWS_S3_CUSTOM_DOMAIN,
        },
    },
    "staticfiles": {  # 靜態文件
        "BACKEND": "storages.backends.s3boto3.S3Boto3Storage",
        "OPTIONS": {
            "access_key": AWS_ACCESS_KEY_ID,
            "secret_key": AWS_SECRET_ACCESS_KEY,
            "bucket_name": AWS_STORAGE_BUCKET_NAME,
            "region_name": AWS_S3_REGION_NAME,
            "default_acl": AWS_DEFAULT_ACL,
            "querystring_auth": AWS_QUERYSTRING_AUTH,
            "object_parameters": AWS_S3_OBJECT_PARAMETERS,
            "custom_domain": AWS_S3_CUSTOM_DOMAIN,
        },
    },
}

結論與最佳實踐

  1. 立即遷移到 STORAGES
    遷移不僅能確保相容性,還能讓你的配置更加靈活與清晰。
  2. 針對靜態文件選擇合適的存儲方式
    根據專案需求,靜態文件可以選擇存放在 S3 或保留在本地。
  3. 環境變數管理敏感資訊
    使用 .env 文件和 python-dotenv 工具來管理憑證,避免將敏感資訊硬編碼到程式中。

遷移到 STORAGES 不僅是為了相容性,更是遵循 Django 的最佳實踐,讓你的專案在未來能穩定運行。

Similar Posts