使用芹菜和django异步上传图像的简单应用程序
django-async-gt的Python项目详细描述
Author: | Gregory Terzian |
---|---|
License: | BSD |
一个Django应用程序包,用于使用芹菜执行常见的异步任务。目前只有一个应用程序,用于保存与芹菜工人上传的图像。
异步图像保存
由于无法将图像传递给芹菜任务,因此此应用程序将解构uploadedfile实例,将其传递给芹菜任务并在那里重新构造它。 最后保存上传的图片。
要求
- python=2.7
- django>;=1.4
- 芹菜=3.0
- pil=1.1.6
安装
要安装,请运行:
pip install django-async-gt
配置
你首先需要在你的项目中设置django芹菜。
设置.py
添加到INSTALLED_APPS:
'async_image_save'
问题:芹菜任务不能接受图像作为参数
django以uploadedfile对象的形式上载图像和其他文件。 uploadedfile是抽象基类,而temporaryuploadedfile和inmemoryuploadedfile是内置的具体子类。 uploadedfile对象的行为有点像file对象,它表示用户用表单提交的一些文件数据。
上传的文件作为request.files的一部分在视图中接收,通常会绑定到表单。 运行表单的is_valid方法将验证此文件,或者在imagefield的情况下验证fiel是否为实际图像,并返回uploadedfile对象供您使用, 作为临时上载文件或InMemoryUploadedFile。
一旦django表单验证成功运行,您就可以安全地假设正在处理实际的图像。正常的业务过程是立即绑定上传的文件对象 将实例保存到数据库。这意味着在客户端仍在等待服务器的响应时将图像保存到数据存储中,这需要几秒钟的时间,特别是在使用s3时。
把图像传给芹菜工人保存在背景中不是更好吗?
问题是芹菜需要能够腌制对象以将其传递给工作人员,而且它不能腌制类似文件的对象(如图像)。
解决方案:解译并重建图像
剩下的选项是解构文件对象,将其数据写入字符串,并获取所需的所有其他信息。 这些数据可以腌制,然后传递给芹菜。然后只需在另一端重建一个实际的temporaryuploadedfile或inmemoryuploadedfile对象, 并通过传递该实例的id和所有其他原始文件“data”,将该对象绑定到模型的实例。最后,您可以保存模型实例。
阅读django文档
将数据绑定到表单:https://docs.djangoproject.com/en/1.4/ref/forms/api/#binding-uploaded-files
如何在项目中使用它
此应用程序的功能位于“保存图像”功能中,可在如下视图中使用。 函数解构图像并将数据发送到异步保存任务。请不要让任务清除缓存。在我看来这是必要的,因为 仅仅将映像添加到实例并不会使缓存失效,就像创建新实例一样,因此在缓存超时之前,用户不会看到保存的映像。 因此,清除任务中的缓存似乎是必要的。
from async_image_save.utils import save_image def example_view(request): if request.method == "POST": form = YourModelForm(request.POST, request.FILES) if form.is_valid(): # assuming your model has a main_photo ImageField # save the instance without an image instance = form.save(commit=False) instance.main_photo = None instance.save() instance.users.add(request.user.userprofile) # send the image to be saved by a worker save_image(form.cleaned_data['main_photo'], instance) return HttpResponseRedirect(reverse('home')) else: form = YourModelForm() context['form'] = form return render_to_response("home.html", context, context_instance=RequestContext(request))