django 部署sae上传图片

由于sae上传版本库只有读的权限。所以采用storage存储上传的图片。         

(1)为应用添加storage服务,并创建一个domain。         
(2)修改models 中的ImageField,需要重写ImageField的save方法。如下:
  • from django.db import models

  • from django.db.models.fields.files import ImageFieldFile,FieldFile,FileField,ImageFile

  • import sae.storage

  • class SAEFieldFile(FieldFile):

  •     def getUploadTo(self):

  •         return self.upload_to

  •     def save(self, name, content, save=True):

  •         name = self.field.generate_filename(self.instance, name)

  •         #for SAE

  •         s = sae.storage.Client()

  •         ob = sae.storage.Object(content._get_file().read())

  •         url =s.put('media', name, ob)

  •         self.name = name

  •         setattr(self.instance, self.field.name, self.name)

  •         # Update the filesize cache

  •         self._size = content.size

  •         self._committed = True

  •         # Save the object because it has changed, unless save is False

  •         #if save:

  •         #    self.instance.save()

  • class SAEImageFieldFile(ImageFile, SAEFieldFile):

  •     def delete(self, save=True):

  •         # Clear the image dimensions cache

  •         if hasattr(self, '_dimensions_cache'):

  •             del self._dimensions_cache

  •         super(ImageFieldFile, self).delete(save)

  • class ZGImageFieldFile(SAEImageFieldFile):

  •     def save(self, name, content, save=True):

  •         super(SAEImageFieldFile, self).save(name, content, save=True)

  • class ZGImageField(models.ImageField):

  •     attr_class = ZGImageFieldFile

  •     def __init__(self, verbose_name=None, name=None, width_field=None, height_field=None, **kwargs):

  •         super(ZGImageField, self).__init__(verbose_name, name, **kwargs)



将以上文件放到你的apps/file.py 中
说明: SAE系统,不支持本地文件的上传(也就是网站代码所在目录不支持写操作), 上传的东西, 必须放到 storage这个地方, 它是一个分布式的系统, 支持大数据量的访问。
而django中, 对于上传的写操作, 依赖于models自带的save()方法(有兴趣的可以看看save的源码), 我们在定义一个ImageField这样的属性的时候, save()就自动包含了保存到本地文件系统的能力, 问题是默认save是保存到代码所在的文件系统的,sae是要求保存到别的地方的, 需要我们重新save方法, 使得上传的东西可以保存在storage这里。 以上代码就是重写的部分
其次, 在你的models.py中, 就可以调用重写后的上传模型了。
  • from pythonpie.apps.files import ZGImageField

  • class TT(models.Model):

  •         #image = ImageField(upload='./media')

  •         image = ZGImageField(upload='./media')



这样就可以了, 在前端页面的显示,需要考虑到 URL全路径, 可以查看admin获取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值