python - Django 配置阿里雲 oss


一.  安裝依賴包

pip install oss2
pip install django-oss-storage

 

二.  settings.py 中添加 oss 配置 (配置完畢后就會生效, 上傳地址, 訪問路徑都會變成 oss 服務器上的)

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

OSS_ACCESS_KEY_ID = ""  
OSS_ACCESS_KEY_SECRET = ""   
OSS_ENDPOINT = "oss-cn-beijing.aliyuncs.com"    # 訪問域名, 根據服務器上的實際配置修改
OSS_BUCKET_NAME = ""    # oss 創建的 BUCKET 名稱

# 添加下面配置后 Django admin 后台上傳的 ImageField, FileField 類型的字段都會被自動上傳到 oss 的服務器中, 訪問路徑也會自動替換
# 如果注釋掉的話 oss 的配置會失效, 上傳文件會存儲到本地, 且訪問路徑也會變成本地
DEFAULT_FILE_STORAGE = 'django_oss_storage.backends.OssMediaStorage'

 

三.  文件上傳路徑說明

class Base(models.Model):
    # oss 服務內的路徑為: /media/base/shipin/xx.mp4  (也是本地數據庫存儲的路徑)
    # oss 服務器文件的訪問地址為 https://ztest.oss-cn-beijing.aliyuncs.com/media/base/shipin/xx.mp4?xxxx 
   shipin = models.FileField(verbose_name="視頻文件", upload_to="base/shipin/", null=True, blank=True)
    

 

四.  異常總結

1. 'Message': 'The bucket you access does not belong to you.'

解決: settings 文件中檢查  OSS_BUCKET_NAME  填寫的名字與服務器上創建的是否一致 

 

2. 'Message': 'The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.'

解決: settings 文件中 OSS_ENDPOINT  填寫錯誤(與服務器上配置的不一致), 其實在錯誤信息里面可以直接拿到, 比如這條報錯:

oss2.exceptions.AccessDenied: {'status': 403, 'x-oss-request-id': '', 'details': {'Code': 'AccessDenied', 'Message': 'The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.', 'RequestId': '', 'HostId': 'xxx.oss-cn-hangzhou.aliyuncs.com', 'Bucket': 'xxx', 'Endpoint': 'oss-cn-beijing.aliyuncs.com'}}   

# 在錯誤信息的最后會提示你的訪問地址

 

 

五.  后台 admin 在 創建/更新 數據時 對圖片進行處理 (縮放, 剪裁等), 刪除數據 的同時將 oss 服務器上的對應文件也刪除

1. 圖片處理的相關操作 - 官方文檔

2. 監聽事件的其他相關操作

class Base(models.Model):
    image = models.FileField(verbose_name="圖片文件", upload_to="base/image/", null=True, blank=True)


# 該表刪除操作時監聽
@receiver(post_delete, sender=Base)
def delete_upload_files(sender, instance, **kwargs):
    # 刪除 oss倉庫 圖片
    files = getattr(instance, 'image')
    if not files:
        return

    # 連接 oss 
    auth = oss2.Auth(settings.OSS_ACCESS_KEY_ID, settings.OSS_ACCESS_KEY_SECRET)
    # 獲取 bucket 
    bucket = oss2.Bucket(auth, settings.OSS_ENDPOINT, settings.OSS_BUCKET_NAME)
    # 刪除文件
    bucket.delete_object(files.file.name)


# 該表更新/創建操作時監聽
@receiver(post_save, sender=Base)
def save_upload_files(sender, instance, **kwargs):
    # 更新 oss倉庫 圖片
    files = getattr(instance, 'image')
    if not files:
        return

    # 要對圖片進行處理的樣式
    style1 = "image/crop,x_10,y_10,w_200,h_200,g_se"
    style2 = 'image/resize,w_700,h_260,m_lfit'
    style3 = 'image/resize,m_fixed,h_260,w_700'

    auth = oss2.Auth(settings.OSS_ACCESS_KEY_ID, settings.OSS_ACCESS_KEY_SECRET)
    bucket = oss2.Bucket(auth, settings.OSS_ENDPOINT, settings.OSS_BUCKET_NAME)
    process = "{0}|sys/saveas,o_{1},b_{2}".format(style,
                                                  oss2.compat.to_string(base64.urlsafe_b64encode(
                                                      oss2.compat.to_bytes(file_name))),
                                                  oss2.compat.to_string(base64.urlsafe_b64encode(
                                                      oss2.compat.to_bytes(settings.OSS_BUCKET_NAME))))
    # 更新文件
    bucket.process_object(files.file.name, process)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM