Django 用 AWS S3 儲存檔案


建立時間: 2022年4月14日 09:14
更新時間: 2023年9月14日 08:47

說明

Django 內建有提供檔案儲存系統,預設會存在專案中
但如果存在專案,久了專案就會變得肥大,為了解決這個問題
我使用 AWS S3 來當作儲存的位置

前置作業

  1. 需要有一個 AWS S3 Bucket,建立方式參考這裡
  2. 建立一個使用者能有權限存取此儲存體

編輯 Bucket CORS

進入 Bucket

截圖2.png

按 Permission

截圖.png

到 CORS 編輯

截圖.png

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "PUT",
            "POST",
            "GET"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    }
]

這設定是要讓所有 AllowedOrigins 地區可以用 AllowedMethods 請求

2. 建立一個使用者能有權限存取此儲存體

請參考 AWS IAM 建立 API 專用的使用者
開啟 AmazonS3FullAccess 存取權限
如果你已經有可以存取 s3 權限的使用者可以忽略此步驟

以上前置作業完成

安裝插件

$ pip install django-storages
$ pip install boto3

到 Django 專案設定

settings.py

INSTALLED_APPS = [
    ...
    'storages',
]

# 配置 AWS
AWS_ACCESS_KEY_ID = 'xxx' # 使用者 access key id
AWS_SECRET_ACCESS_KEY = 'xxx' # 使用者 secret access key
AWS_STORAGE_BUCKET_NAME = 'my-bucket' # s3 儲存體名稱
AWS_S3_FILE_OVERWRITE = False  #同名檔案是否要覆寫
AWS_DEFAULT_ACL = None

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' #預設使用 s3 儲存檔案

設定完成後可以簡單的測試一下

打開終端,到專案底下,使用指令互動模式
$ cd path/to/your_project
$ python manage.py shell

>>> from django.core.files.storage import default_storage
>>> default_storage.exists('storage_test')
False
>>> file = default_storage.open('storage_test', 'w')
>>> file.write('storage contents')
>>> file.close()

>>> default_storage.exists('storage_test')
True
>>> file = default_storage.open('storage_test', 'r')
>>> file.read()
'storage contents'
>>> file.close()

>>> default_storage.delete('storage_test')
>>> default_storage.exists('storage_test')
False

參考

https://www.learncodewithmike.com/2020/05/django-aws-s3.html
https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html

觀看次數: 1516
djangopythonawss3
按讚追蹤 Enjoy 軟體 Facebook 粉絲專頁
每週分享資訊技術

一杯咖啡的力量,勝過千言萬語的感謝。

支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!