「阿里OSS」集成Django的基本配置及使用-1

环境信息:

  • python 3.6.2
  • Django 2.0.1

依赖库安装:

1
pip install oss2

说明:

  1. 主要的实现思路是通过model 的信号量(signals)监测model 的create 以及update 动作,随后把相应的文件上传至阿里服务器;
  2. 通过Django 的MEDIA_URL来配置上传文件的访问路径。

signals.py 的配置:

Django中一个app 内的目录如下:

- goods/  # 这是一个app
  - apps.py
  - models.py
  - views.py
  - signals.py
  1. signals.py的编写:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    import oss2
    from django.db.models.signals import post_save, post_init
    from django.dispatch import receiver
    from project.settings import ACCESS_KEY_ID, ACCESS_KEY_SECRET, ALI_OSS_ENDPOINT, ALI_BUCKET_NAME

    from goods.models import GoodsSeries


    # 获取修改前的图片
    @receiver(post_init, sender=GoodsSeries)
    def get_original_image(instance, **kwargs):
    instance.__original_image = instance.image


    # 根据图片更新情况上传图片
    @receiver(post_save, sender=GoodsSeries)
    def create_user(sender, instance=None, created=False, **kwargs):
    if not created and instance.__original_image == instance.image:
    # 图片没有更新
    pass
    else:
    # 新建对象或更新
    img = instance.image
    auth = oss2.Auth(ACCESS_KEY_ID, ACCESS_KEY_SECRET)
    img_path = './media/' + str(img)
    bucket = oss2.Bucket(auth, ALI_OSS_ENDPOINT, ALI_BUCKET_NAME)
    bucket.put_object_from_file('media/' + img.name, img_path)
  2. apps.py内导入signals:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    from django.apps import AppConfig


    class GoodsConfig(AppConfig):
    name = 'goods'
    verbose_name = "产品管理"

    def ready(self):
    import goods.signals

settings.py 的配置:

  1. 阿里OSS秘钥等其他基本配置(具体看官方文档):

    1
    2
    3
    4
    5
    ...
    ACCESS_KEY_ID = 'access key id'
    ACCESS_KEY_SECRET = 'access key secret'
    ALI_OSS_ENDPOINT = 'oss-cn-shenzhen.aliyuncs.com' # 具体看文档,这个是类似存放服务器地区的东西
    ALI_BUCKET_NAME = 'bucket' # 具体看文档,这个是类似仓库名的东西
  2. 配置MEDIA_URL

    1
    2
    3
    4
    ...
    # 这个URL需要根据 ALI_OSS_ENDPOINT 、 ALI_BUCKET_NAME 以及 signals.py 填的路径进行配置
    MEDIA_URL = 'http://bucket.oss-cn-shenzhen.aliyuncs.com/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

后续:

参考: