博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Django学习之第三方储存服务器的使用

Posted on 2017-08-23 14:48  开飞机的贝塔  阅读(1616)  评论(0编辑  收藏  举报

最近,越来越多的公司采用第三方储存来作为视频,图片的储存工具。

国内的像七牛,阿里云的OSS,国外的像亚马逊的S3,微软的azure都是非常有名的第三方储存。

下面以阿里的OSS为例,来介绍第三储存的使用:

1.安装python对OSS操作的模块

pip install oss2

2.再安装python对OSS储存的模块

pip install django-aliyun-oss2-storage

3.设置settings.py文件

    # 使用OSS存储文件
    DEFAULT_FILE_STORAGE = 'aliyun_oss2_storage.backends.AliyunMediaStorage'
     
    # 配置OSS信息
    ACCESS_KEY_ID = "xxxxxxxxxxx"
    ACCESS_KEY_SECRET = "xxxxxxxxxxx"
    END_POINT = "oss-cn-shanghai.aliyuncs.com"  # OSS存储节点
    BUCKET_NAME = "xxx"
    BUCKET_ACL_TYPE = "public-read"  # private, public-read, public-read-write

MEDIA_ROOT是媒体文件的上传位置根目录,由于设置了BUCKET_NAME,一般在这个bucket中。所以设置为空字符串。

文件自然上传到Django模版的FileField字段设置的upload_to位置。

MEDIA_URL是获取媒体文件的链接前缀,可根据自己的oss文件链接位置添加。

由于上传的文件需要开放被用户下载,BUCKET_ACL_TYPE设置为公共的。若你的静态文件也需要上传到OSS中,设置如下:

    # 设置上传的静态文件
    STATICFILES_STORAGE = 'aliyun_oss2_storage.backends.AliyunStaticStorage'

解决文件名称乱码问题:

打开该包的源码文件backends.py,找到AliyunBaseStorage类的_save方法。修改如下:

    def _save(self, name, content):
        # 获得文件名
        filename = str(content)
     
        # 设置header
        headers = {}
        headers['Content-Type'] = 'application/octet-stream'
        headers['Content-Disposition'] = 'attachment; filename=%s' % filename
     
        # get oss' target name
        name = self._get_target_name(name)
     
        content.open()
        content_str = b''.join(chunk for chunk in content.chunks())
        self.bucket.put_object(name, content_str, headers=headers)  # add headers
        content.close()
     
        return self._clean_name(name)