环境信息:
- python 3.6.2
- Django 2.0.1
依赖库安装:
1 | pip install oss2 |
说明:
- 主要的实现思路是通过model 的信号量(signals)监测model 的create 以及update 动作,随后把相应的文件上传至阿里服务器;
- 通过Django 的
MEDIA_URL
来配置上传文件的访问路径。
signals.py 的配置:
Django中一个app 内的目录如下:
- goods/ # 这是一个app
- apps.py
- models.py
- views.py
- signals.py
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
27import 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
# 获取修改前的图片
def get_original_image(instance, **kwargs):
instance.__original_image = instance.image
# 根据图片更新情况上传图片
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)在
apps.py
内导入signals:1
2
3
4
5
6
7
8
9from django.apps import AppConfig
class GoodsConfig(AppConfig):
name = 'goods'
verbose_name = "产品管理"
def ready(self):
import goods.signals
settings.py 的配置:
阿里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' # 具体看文档,这个是类似仓库名的东西配置
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')
后续:
参考: