2024-09-26 18:06:52 发布
网友
在pythondjango中,我有一个包含FileField成员的模型。此成员存储视频文件。在
我想“干扰”Django的标准“添加模型行/对象/实例”过程,并在实际提交或将其添加到数据库之前,操作我添加的每个视频。在
操作是将视频转换为特定的统一格式。因此,所有添加的视频最终将以相同的格式存储(WebM)。在
我怎么能做到呢?我调查过Django的客户经理,但我不认为这就是我要找的。在
谢谢。:)
您可以重写save()或使用signals。在
save()
但是,转换视频将花费大量时间。在web请求中同步执行这项操作可能不是一个好主意。一种常见的方法是将工作卸载到任务队列中。请看一下Celery。在
实际上我也在做同样的事情。由于以下几个原因,您不希望在收到相同请求时处理该视频文件:
1)你会把用户挂在一个没有响应的页面上很长一段时间,可能会让他们超时并怀疑它是否有效。 2) 如果他们去看看它是否上传-它还没有完成并保存在数据库(不一致),他们会认为它是坏的。在
您希望最初将记录和文件保存在服务器上。标记为需要处理。然后启动一个芹菜任务来完成这项工作,并在完成后更新该标志。实际上,我正在为一个我现在正在做的项目和zencoder做同样的事情。它工作得很好。在
芹菜:http://pypi.python.org/pypi/django-celery 贫民区(当地人):http://pypi.python.org/pypi/ghettoq
或者您可以使用django signals在项目即将或已经保存到数据库时触发事件。在
具体来说,您可以使用Signal.connect()方法连接要启动的信号处理程序,例如pre_save、post_save、pre_delete、post_delete等
pre_save
post_save
pre_delete
post_delete
为了把事情安排好:
信号.py:
from django.db.models.signals import * def entry_action_post_save(sender, instance, **kwargs): # what do we want to do here? pass post_save.connect (entry_action_post_save, sender=Entry)
对我来说,Entry是models.Model派生的类。在
Entry
models.Model
{a3}的另一种设置方式。在
请注意,由于您在这里考虑视频编码,您可能不想在这些方法中实际重新编码视频,否则您的请求将永远无法完成。更好的方法是检查编码,并让模型有一个status字段来表示webM或{}。然后把你的编码任务转移到别处,在视频完成之前不要显示它(Videos.objects.filter(format='webm')。在
status
webM
Videos.objects.filter(format='webm'
您可以重写
save()
或使用signals。在但是,转换视频将花费大量时间。在web请求中同步执行这项操作可能不是一个好主意。一种常见的方法是将工作卸载到任务队列中。请看一下Celery。在
实际上我也在做同样的事情。由于以下几个原因,您不希望在收到相同请求时处理该视频文件:
1)你会把用户挂在一个没有响应的页面上很长一段时间,可能会让他们超时并怀疑它是否有效。 2) 如果他们去看看它是否上传-它还没有完成并保存在数据库(不一致),他们会认为它是坏的。在
您希望最初将记录和文件保存在服务器上。标记为需要处理。然后启动一个芹菜任务来完成这项工作,并在完成后更新该标志。实际上,我正在为一个我现在正在做的项目和zencoder做同样的事情。它工作得很好。在
芹菜:http://pypi.python.org/pypi/django-celery 贫民区(当地人):http://pypi.python.org/pypi/ghettoq
或者您可以使用django signals在项目即将或已经保存到数据库时触发事件。在
具体来说,您可以使用Signal.connect()方法连接要启动的信号处理程序,例如
pre_save
、post_save
、pre_delete
、post_delete
等为了把事情安排好:
信号.py:
对我来说,
Entry
是models.Model
派生的类。在{a3}的另一种设置方式。在
请注意,由于您在这里考虑视频编码,您可能不想在这些方法中实际重新编码视频,否则您的请求将永远无法完成。更好的方法是检查编码,并让模型有一个}。然后把你的编码任务转移到别处,在视频完成之前不要显示它(
status
字段来表示webM
或{Videos.objects.filter(format='webm'
)。在相关问题 更多 >
编程相关推荐