1. 程式人生 > 其它 >Django admin實現圖片上傳到騰訊雲

Django admin實現圖片上傳到騰訊雲

官網參考:https://docs.djangoproject.com/zh-hans/3.2/howto/custom-file-storage/

當前業務需要使用django的admin後臺進行資料的管理,需要實現檔案的上傳雲端-騰訊雲

具體實現:

安裝依賴包:
pip install cos-python-sdk-v5==1.9.10

自定義一個儲存類:

1)繼承Django.core.files.storage.Storage

2)重寫save方法

3)新增裝飾器,方便進行資料庫檔案的遷移django.utils.deconstruct.deconstructible

demo:

#!/usr/bin/env python
# 
-*- coding: utf-8 -*- from django.conf import settings from django.core.files.storage import Storage from django.utils.deconstruct import deconstructible from qcloud_cos import CosConfig, CosS3Client from .common import generate_img_url secret_id = settings.OSS_QCLOUD_SECRET_ID secret_key = settings.OSS_QCLOUD_SECRET_KEY region
= settings.OSS_QCLOUD_REGION bucket = settings.OSS_QCLOUD_BUCKET token = settings.OSS_QCLOUD_TOKEN scheme = settings.OSS_QCLOUD_SCEHME config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Scheme=scheme) client = CosS3Client(config) host = settings.OSS_PREFIX @deconstructible
class CosStorage(Storage): def save(self, name, content, max_length=None): """ 重寫save方法 """ # suffix = name.split('.')[-1] # key = self.generate_key(suffix) key = generate_img_url(name) try: response = client.put_object( Bucket=bucket, Body=content.read(), Key=key, StorageClass='STANDARD', EnableMD5=True ) except Exception as e: raise return host + key def url(self, name): return name

配置檔案中需要新增配置項:

OSS_QCLOUD_SECRET_ID = 'sercret-id'
OSS_QCLOUD_SECRET_KEY = 'secret-key'
OSS_QCLOUD_REGION = '所選區域'
OSS_QCLOUD_BUCKET = '建立的bucket'
OSS_QCLOUD_TOKEN = None
OSS_QCLOUD_SCEHME = 'https'
OSS_NAMESPACE = '可以區分場景'
OSS_PREFIX = 'https://xxx.cos.所選區域.myqcloud.com'

公共方法:

# 生成圖片路徑
def generate_img_url(file_name, scene='default'):
    file_ext = file_name.rsplit('.', 1)[-1]
    new_file_name = scene + '_' + str(datetime.datetime.today()).replace('-', '').replace(' ', '_').replace(':', '') + '.' + file_ext
    namespace = settings.OSS_NAMESPACE
    return f'/{namespace}/' + new_file_name

最後新增到model中定義的欄位中

file = models.FileField(verbose_name='檔案', storage=CosStorage())


# 注意:這裡使用的FileField   如果是圖片的話可以使用ImageField

參考:https://www.jianshu.com/p/cb7a7f31e962