django标准化图像场
django-stdimage的Python项目详细描述
django标准图像字段
实现以下功能的django字段:
- Django存储兼容(S3)
- 将图像调整为不同大小
- 在模型级别访问缩略图,不需要模板标记
- 保留原始图像
- 异步渲染(Celery&Co)
- 多线程和处理以获得最佳性能
- 限制接受的图像尺寸
- 将文件重命名为标准名称(使用可调用的上载到)
安装
只需使用命令安装最新的稳定软件包即可
pip install django-stdimage
# or
pipenv install django-stdimage
把'stdimage'
添加到INSTALLED_APP
的设置中。py,就这样!
用法
StdImageField
工作起来就像django自己的
ImageField
但您可以指定不同大小的变体。
JPEGField
的工作原理与StdImageField
类似,但所有大小变化都是
转换为JPEG,无论原始文件是哪种类型。
变化
变体在字典中指定。键将是引用调整大小的图像的属性。 变体既可以定义为元组,也可以定义为字典。
示例:
fromdjango.dbimportmodelsfromstdimageimportStdImageField,JPEGFieldclassMyModel(models.Model):# works just like django's ImageFieldimage=StdImageField(upload_to='path/to/img')# creates a thumbnail resized to maximum size to fit a 100x75 areaimage=StdImageField(upload_to='path/to/img',variations={'thumbnail':{'width':100,'height':75}})# is the same as dictionary-style callimage=StdImageField(upload_to='path/to/img',variations={'thumbnail':(100,75)})# variations are converted to JPEGsjpeg=JPEGField(upload_to='path/to/img',variations={'full':(float('inf'),float('inf')),'thumbnail':(100,75)},)# creates a thumbnail resized to 100x100 croping if necessaryimage=StdImageField(upload_to='path/to/img',variations={'thumbnail':{"width":100,"height":100,"crop":True}})## Full ammo here. Please note all the definitions below are equalimage=StdImageField(upload_to='path/to/img',blank=True,variations={'large':(600,400),'thumbnail':(100,100,True),'medium':(300,200),},delete_orphans=True)
要在模板中使用生成的变体,请使用myimagefield.variation_name
。
示例:
<ahref="{{ object.myimage.url }}"><imgalt=""src="{{ object.myimage.thumbnail.url }}"/></a>
utils
自从版本4以来,定制的upload_to
实用程序已经被删除,取而代之的是
Django Dynamic Filenames。
验证器
StdImageField
不实现任何大小验证。可以使用validator属性指定验证
并使用这个包附带的一组验证器。
验证程序可用于窗体和模型。
示例
fromdjango.dbimportmodelsfromstdimage.validatorsimportMinSizeValidator,MaxSizeValidatorfromstdimage.modelsimportStdImageFieldclassMyClass(models.Model):image1=StdImageField(validators=[MinSizeValidator(800,600)])image2=StdImageField(validators=[MaxSizeValidator(1028,768)])
注意:应小心使用maxsizevalidator。 由于存储并不昂贵,因此不应限制上载维度。 如果寻求防止用户溢出内存,则应限制http上载正文大小。
删除图像
djangodropped support 用于版本1.3中的自动删除。
从版本5开始,这个包支持一个delete_orphans
参数。它将删除
孤立文件,如果通过django form或and object删除或替换文件
删除StdImageField
。如果字段值更改或
按程序重新分配。在那些罕见的情况下,您需要处理正确的删除
你自己。
fromdjango.dbimportmodelsfromstdimage.modelsimportStdImageFieldclassMyModel(models.Model):image=StdImageField(upload_to='path/to/files',variations={'thumbnail':(100,75)},delete_orphans=True,blank=True,)
异步图像处理
像芹菜这样的工具允许在请求之外执行耗时的任务。如果你不想 为了等待在请求中呈现您的变体,stdimage提供了一个选项来传递 async关键字和一个util。 注意,回调不是事务保存,但文件会在那里。 这个例子是以芹菜为基础的。
tasks.py
:
fromdjango.appsimportappsfromceleryimportshared_taskfromstdimage.utilsimportrender_variations@shared_taskdefprocess_photo_image(file_name,variations,storage):render_variations(file_name,variations,replace=True,storage=storage)obj=apps.get_model('myapp','Photo').objects.get(image=file_name)obj.processed=Trueobj.save()
models.py
:
fromdjango.dbimportmodelsfromstdimage.modelsimportStdImageFieldfrom.tasksimportprocess_photo_imagedefimage_processor(file_name,variations,storage):process_photo_image.delay(file_name,variations,storage)returnFalse# prevent default renderingclassAsyncImageModel(models.Model):image=StdImageField(# above task definition can only handle one model object per image filenameupload_to='path/to/file/',render_variations=image_processor# pass boolean or callable)processed=models.BooleanField(default=False)# flag that could be used for view querysets
重新渲染变体
您可能需要向字段中添加新的变体。这意味着您需要为丢失的字段呈现新的变体。 这可以通过使用管理命令来实现。
python manage.py rendervariations 'app_name.model_name.field_name'[--replace][-i/--ignore-missing]
^ {CD13>}选项将替换所有现有文件。
ignore-missing
选项将挂起丢失的源文件错误并保留
呈现其他文件的变体。其他虎钳命令将首先停止
缺少文件。
多处理
因为版本2 stdimage支持多处理。 每个图像都是在不同的过程中渲染的。 它不仅提高了性能,而且还增加了垃圾收集 因此以前版本的内存占用也很大。
注意:pypy在多处理方面似乎有一些问题, 因此,pypy中的所有多处理都被禁用。