删除旧文件。
项目描述
功能
django-cleanup 应用程序自动删除 FileField
、ImageField
和其子类的文件。当 FileField
的值更改且模型被保存时,旧文件将被删除。当删除具有 FileField
的模型时,文件也将被删除。设置为 FileField
默认值的文件将不会被删除。
兼容性
此应用程序遵循Django的 支持版本 和 Python版本支持。
与 sorl-thumbnail 兼容
与 easy-thumbnail 兼容
它是如何工作的?
为了跟踪FileField
的变化并方便文件删除,django-cleanup将post_init
、pre_save
、post_save
和post_delete
信号连接到每个具有FileField
的INSTALLED_APPS
模型的信号处理器。为了判断FileField
的值是否已更改,模型实例上保留了一个本地缓存的原值。如果检测到应导致文件删除的条件,则设置一个删除文件的函数并将其插入当前事务的提交阶段。
警告!请注意以下已知的限制!
安装
pip install django-cleanup
配置
将django_cleanup
添加到settings.py
中INSTALLED_APPS
的底部
INSTALLED_APPS = (
...,
'django_cleanup.apps.CleanupConfig',
)
这就是全部内容,不需要其他配置。
注意:INSTALLED_APPS
的顺序很重要。为了确保其他应用信号处理程序中的异常不会影响事务中文件删除的完整性,django_cleanup
应该放在INSTALLED_APPS
的最后。
故障排除
如果您注意到django-cleanup
在预期的情况下没有删除文件,请检查您的模型是否被正确加载
您必须在应用程序的models.py或models/__init__.py中定义或导入所有模型。否则,应用注册表可能在此点尚未完全填充,这可能导致ORM故障。
如果您的模型未加载,django-cleanup
将无法发现其FileField
。
您可以使用以下方法检查您的Model
是否已加载
from django.apps import apps
apps.get_models()
已知限制
数据库应支持事务
如果您使用的是不支持事务的数据库,当事务在合适的时候回滚时,您可能会丢失文件。这种情况通过我们使用post_save
和post_delete
信号,并遵循此README中推荐的配置来减轻。如果在应用初始化后注册了信号并且处理这些信号时出现异常,这种结果仍然会发生。在这种情况下,旧文件将会丢失,新文件在模型中不会被引用,尽管新文件可能仍然存在于磁盘上。如果您担心这种行为,您需要在项目中寻找另一种删除旧文件的方法。
由多个模型实例引用的文件
此应用假定每个文件只被引用一次。如果您在两个或多个模型实例之间共享文件,您将不会得到期望的功能。在复制模型实例时要小心,因为这会导致文件被多个实例共享。如果您想从多个模型引用文件,请添加一层间接引用。也就是说,使用一个单独的文件模型,该模型通过外键被其他模型引用。在django生态系统中有许多文件管理应用已经实现了这种行为。
高级
本节包含可用于与django-cleanup进行特殊案例交互的附加功能。
信号
为了方便与其他django应用交互,django-cleanup发送以下信号,可以从django_cleanup.signals
导入
cleanup_pre_delete
:在文件删除之前。传递一个file
关键字参数。cleanup_post_delete
:在文件删除之后。传递一个file
关键字参数。
signals
示例为sorl.thumbnail
from django_cleanup.signals import cleanup_pre_delete
from sorl.thumbnail import delete
def sorl_delete(**kwargs):
delete(kwargs['file'])
cleanup_pre_delete.connect(sorl_delete)
刷新缓存
在极少数情况下,需要刷新缓存。为此,可以使用django_cleanup.cleanup.refresh
方法
from django_cleanup import cleanup
cleanup.refresh(model_instance)
忽略特定模型的清理
要忽略一个模型,并在删除模型或其文件更改时不对模型进行清理,请使用ignore
装饰器标记该模型
from django_cleanup import cleanup
@cleanup.ignore
class MyModel(models.Model):
image = models.FileField()
仅清理所选模型
如果您有很多模型要忽略,或者如果您希望明确指定所选模型,可以通过使用选择模式应用程序配置将django-cleanup的模式更改为“选择模式”。在您的INSTALLED_APPS
设置中,您将用django_cleanup.apps.CleanupConfig
替换为django_cleanup.apps.CleanupSelectedConfig
。然后使用select
装饰器标记要清理的模型
from django_cleanup import cleanup
@cleanup.select
class MyModel(models.Model):
image = models.FileField()
如何运行测试
使用pyenv安装所有所需的cPython版本(见tox.ini)。
设置pyenv以激活django-cleanup本地仓库中的所有python版本。确保首先安装的是最新支持的python版本。
在最新支持的python版本上安装tox,然后从本地django-cleanup仓库运行tox
命令。
如何编写测试
在编写测试时,此应用程序要求使用django.test.TransactionTestCase。
有关为什么需要此的详细信息,请参阅此处
Django的
TestCase
类在每个测试中包装一个事务,并在每个测试后回滚该事务,以提供测试隔离。这意味着永远不会实际提交事务,因此您的on_commit()
回调将不会运行。如果您需要测试on_commit()
回调的结果,请使用TransactionTestCase
。
pytest
在编写使用pytest的测试时,使用带有transaction=True
参数的@pytest.mark.django_db以确保与使用事务测试用例相同的行为。
许可证
根据MIT许可证条款,django-cleanup是免费软件
MIT许可证
版权所有 (C) 2012 by Ilya Shalyapin, ishalyapin@gmail.com
在此,免费地向任何获得此软件和相关文档副本(“软件”)的人授予,允许在不受限制的情况下处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许向获得软件的人提供软件副本以执行上述操作,前提是
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、针对特定目的的适用性和非侵权性保证。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任负责,无论是基于合同、侵权或其他原因,源于、因或与软件或其使用或其他方式有关。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。