当前位置:   article > 正文

django admin后台管理系统上传添加的图片保存到阿里云oss中_django 使用阿里云oss

django 使用阿里云oss

目录

一、配置admin上传图片到阿里云oss

二、配置admin后台上传到阿里云oss的图片为自定义名


问题描述:在开发自己的应用/网页前后台时可以调用阿里云oss的接口将图片上传至oss保存和读取,非常方便。但在django自带的admin后台中如何配置添加的图片也上传到阿里云oss中保存呢?

一、配置admin上传图片到阿里云oss

1,models模型

  1. class Product(models.Model):
  2. """常规商品"""
  3. name = models.CharField(verbose_name="商品名称", max_length=50)
  4. desc = models.TextField(verbose_name="描述")
  5. show_img = models.ImageField(verbose_name="展示图", upload_to='images/')
  6. detail_img = models.ImageField(verbose_name="详情图", upload_to='images/')
  7. is_sale = models.BooleanField(verbose_name="是否上架", default=False) # 为False时是下架
  8. is_show = models.BooleanField(verbose_name="是否展示在首页", default=True) # 为True时是展示在首页
  9. create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
  10. update_time = models.DateTimeField(auto_now=True, verbose_name="最后一次修改时间")
  11. def __str__(self):
  12. return self.name
  13. class Meta:
  14. verbose_name = "常规商品"
  15. verbose_name_plural = verbose_name

2,配置media,支持图片上传

settings.py

  1. # settings.py
  2. MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
  3. MEDIA_URL = '/media/'

项目根urls.py

  1. # urls.py 添加media配置
  2. from django.views.static import serve
  3. from django.urls import path, include, re_path
  4. urlpatterns = [
  5. path('admin/', admin.site.urls),
  6. path('users/', include('users.urls')),
  7. path('goods/', include('goods.urls')),
  8. # 新增media配置
  9. re_path(r'^media/(?P<path>.*)$', serve, {"document_root": settings.MEDIA_ROOT}),
  10. ]

3,安装所需的模块

安装django-aliyun-oss2-storage,参考github上的 配置安装django-aliyun-oss2-storage

pip install -i https://pypi.douban.com/simple django-aliyun-oss2-storage

 如果pip安装不成功,可以到github中下载下来源码,解压后进入到setup.py所在的目录使用python setup.py install命令安装(过程中可能会报错,根据报错提示修改一下源码即可成功安装)

 4,settings.py中的相关配置

  1. # admin后台上传图片到oss
  2. DEFAULT_FILE_STORAGE = 'aliyun_oss2_storage.backends.AliyunMediaStorage' # 默认admin 上传oss配置
  3. ACCESS_KEY_ID = "40ZhE1HyuWdllpMh"
  4. ACCESS_KEY_SECRET = "KbxtlKSvKyuyuymTiQvrxhsYFMguXy"
  5. END_POINT = "oss-us-west-1.aliyuncs.com"
  6. BUCKET_NAME = "XXXX"
  7. ALIYUN_OSS_CNAME = "" # 自定义域名,如果不需要可以不填写
  8. BUCKET_ACL_TYPE = "private" # private, public-read, public-read-write
  9. # private:仅创建者可以访问对象,默认值。
  10. # public-read:所有人都可以读取对象,但只有创建者可以写入。
  11. # public-read-write:所有人都可以读取和写入对象,不推荐使用。
  12. # authenticated-read:所有 AWS 用户都可以读取对象,但只有创建者可以写入。
  13. # aws-exec-read:Amazon EC2 实例可以读取对象,但只有创建者可以写入。
  14. # bucket-owner-read:存储桶所有者可以读取对象,但其他人不行。
  15. # bucket-owner-full-control:存储桶所有者可以读取和写入对象,其他人不行。

至此,再次在admin后台中添加图片保存时就可以自动上传到阿里云oss中了

二、配置admin后台上传到阿里云oss的图片为自定义名

问题:admin后台在上传图片保存到oss时,会直接使用上传时的图片名称,这样会导致当存在同名文件上传时会替换掉之前上传的同名文件,这并不是我们想要的结果,所以对上传的图片进行自动生成不重复的名称就显得尤为重要!

1,重写默认方法

  1. import os
  2. from aliyun_oss2_storage.backends import AliyunMediaStorage
  3. class AdminMediaStorage(AliyunMediaStorage):
  4. """重写AliyunMediaStorage自定义admin后台上传到阿里云oss的图片名称"""
  5. def get_available_name(self, name, max_length=None):
  6. # 生成admin后台自定义的图片名称
  7. ext = name.split('.')[-1]
  8. filename = '{}.{}'.format(uuid.uuid4().hex, ext)
  9. return super().get_available_name(filename, max_length), name
  10. def _save(self, name, content):
  11. # 获取存储路径并保存到阿里云OSS
  12. path = os.path.split(name[1])
  13. if getattr(content, 'content_type', None) is None:
  14. content_type = mimetypes.guess_type(name)[0]
  15. content.content_type = content_type
  16. return super()._save(path[0] + '/' + name[0], content)

 注:我这里重写的_save方法最后调用的了超类的_save方法的第一个参数是拼接了阿里云oss里保存文件的路径,如user/image/head_img.png

2,修改settings.py中原有的配置

原配置

DEFAULT_FILE_STORAGE = 'aliyun_oss2_storage.backends.AliyunMediaStorage'

 替换为

DEFAULT_FILE_STORAGE = 'goods.admin.AdminMediaStorage'  # 自定义admin 上传oss配置

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/494084
推荐阅读
相关标签
  

闽ICP备14008679号