Django-storages 配置:環境變數設定

更新日期: 2024 年 12 月 18 日

在開發和部署 Django 應用程式時,使用 .env 文件來管理敏感資訊(例如 AWS 憑證)是一種最佳實踐。

配合 django-storages 和 AWS S3,可以實現安全高效的文件存儲與訪問。

本篇文章將詳細介紹如何使用 .env 文件及 python-dotenv 工具來管理環境變數,並進一步結合 AWS S3 的設置,打造完善的文件存儲方案。


為什麼需要 .env 文件

.env 文件的主要作用是集中管理敏感的環境變數,例如:

  • AWS 憑證 (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
  • S3 Bucket 名稱 (AWS_STORAGE_BUCKET_NAME)
  • 自定義域名或其他相關配置

好處

  1. 安全性:避免將敏感資訊硬編碼到程式碼中。
  2. 靈活性:能輕鬆切換不同環境的配置,例如開發環境與生產環境。
  3. 可共享性:通過 .env.example 為其他開發者提供配置範本。

配置 .env 文件

創建 .env 文件

在專案根目錄下建立 .env 文件,並填入 AWS 的相關憑證:

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-northeast-1  

創建 .env.example 文件(非必須,但建議)

.env.example.env 文件的模板,供其他開發者參考,內容示例如下:

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=your-region-name  

注意:不要將 .env 文件提交到版本控制系統,而應提交 .env.example 文件,指導團隊如何設置環境變數。


確保 Django 能讀取 .env 文件中的變數

加載 .env 文件

方法一:手動設置環境變數

手動將 .env 文件中的變數加載到系統環境中:

  1. Linux/macOS
    .env 文件內容添加到 ~/.bashrc~/.zshrc,然後運行: source ~/.bashrc # 或 source ~/.zshrc
  2. Windows
    在系統「環境變數」設置界面,手動添加每個變數。

方法二:使用 python-dotenv 工具(推薦)

python-dotenv 是一個工具,能自動將 .env 文件中的變數加載到系統環境變數中。

步驟如下:

  1. 安裝 python-dotenv
pip install python-dotenv
  1. settings.py 文件的開頭加載 .env 文件:
from dotenv import load_dotenv
import os

# 加載 .env 文件
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')

注意事項與常見問題

確保 .env 文件被正確加載

  • 如果未使用 python-dotenv,請手動檢查 .env 文件中的變數是否已載入系統環境: echo $AWS_ACCESS_KEY_ID 如果未返回正確值,請確認是否正確加載 .env 文件。

.env.example 的作用

  • .env.example 不會影響程式運行,它僅作為範本,指導開發者正確設置 .env 文件。
  • 在部署專案時,需將 .env.example 文件的內容複製到 .env 文件,並填寫實際值。

測試環境變數讀取

啟動 Django 開發伺服器,並檢查變數是否正確讀取:

python manage.py runserver

如果一切正確,應該可以正常上傳文件至 S3,並生成可訪問的文件 URL。


設定總結與最佳實踐

.env 文件設定

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-northeast-1

Django 配置範例

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.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/'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

最佳實踐

  1. 使用 .env 管理敏感資訊,避免硬編碼到程式碼中。
  2. 提供 .env.example 作為配置範本,幫助團隊快速部署。
  3. 使用 python-dotenv 自動加載 .env 文件,簡化本地開發環境配置。

結論

通過 .env 文件和 python-dotenv 的結合,你可以輕鬆管理環境變數,並將 AWS S3 文件存儲功能無縫集成到 Django 中。

Similar Posts