Skip to content

Instantly share code, notes, and snippets.

@githubutilities
Last active November 13, 2015 10:24
Show Gist options
  • Select an option

  • Save githubutilities/d2a6606257045366eff4 to your computer and use it in GitHub Desktop.

Select an option

Save githubutilities/d2a6606257045366eff4 to your computer and use it in GitHub Desktop.
SAE Storage Using Django

SAE Storage Using Django

rewrite files/storage.py.

#coding=utf8

from django.core.files.storage import Storage
from django.core.files.base import ContentFile
from django.conf import settings
import sae.storage
import re


class SAEStorage(Storage):
    def __init__(self, domain_name=''):  # 可传入一个参数,即Storage的DomainName,若为空则默认为settings.py中的
        if not domain_name:                  # SAE_DEFAULT_STORAGE_DOMAIN_NAME选项
            domain_name = settings.SAE_DEFAULT_STORAGE_DOMAIN_NAME
        self.__bucket = sae.storage.Bucket(domain_name)  # 创建Bucket对象

    def delete(self, name):  # 重写 删除 方法
        self.__bucket.delete_object(name)

    def exists(self, name):  # 重写 判断存在 方法
        try:
            self.__bucket.stat_object(name)
            return True
        except sae.storage.Error:
            return False

    def size(self, name):    # 重写 文件大小 方法
        try:
            stat = self.__bucket.stat_object(name)
        except sae.storage.Error:
            return -1
        return int(stat['bytes'])

    def url(self, name):   # 重写 获得文件URL 方法
        return self.__bucket.generate_url(name)

    def _open(self, name, mode='rb'):  # 重写 打开文件 方法
        try:
            return ContentFile(self.__bucket.get_object_contents(name))
        except:
            return None

    def _save(self, name, content):  # 重写 保存文件 方法
        self.__bucket.put_object(name, content)
        return name

    def listdir(self, path):  # 重写 列目录 方法
        r = re.compile('^%s' % path)
        remove_prefix = lambda name: r.sub('', name)
        return [(remove_prefix(attr['name']), None) for attr in self.__bucket.list(path=path)]

modify project settings.py

if DEPLOYED:
    DEFAULT_FILE_STORAGE = 'files.storage.SAEStorage'
    SAE_DEFAULT_STORAGE_DOMAIN_NAME = 'imgs'
else:
    DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'

Reference

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment