django标准化图像场

django-stdimage的Python项目详细描述


versioncicodecovMIT License

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中的所有多处理都被禁用。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
添加组件后,java JTable为空   java将json发送到php并插入mysql,但返回null   java Spring引导JNDI CommonJ资源   从不同PC创建和合并后的Java servlet问题   java如何在使用findelements时从xpath获取文本   java使用spring boot使用gmail smtp发送电子邮件   java在不使用pojo、bean或getter和setter的情况下获取Json标题的Json数组   Java中的OpenFile对话框将null作为响应   JavaBuilder模式。扩展接口   java中无需替换的数据结构选取   java如何评价Encog中的预测神经网络   java如何在安卓中使用实际的HttpURLConnection进行单元测试?   java使用XML配置禁用WebSocket中的CSRF保护   java如何通过hibernate从多表查询中获取数据?   mysql如何在java中获取更新的行Id   java AEM/CQ组件单一组件/有限组件   java FFmpeg Javacv延迟问题   显示整数数组的java不起作用