使用芹菜和django异步上传图像的简单应用程序

django-async-gt的Python项目详细描述


Author:Gregory Terzian
License:BSD

一个Django应用程序包,用于使用芹菜执行常见的异步任务。目前只有一个应用程序,用于保存与芹菜工人上传的图像。

异步图像保存

由于无法将图像传递给芹菜任务,因此此应用程序将解构uploadedfile实例,将其传递给芹菜任务并在那里重新构造它。 最后保存上传的图片。

许可证

所有代码都在bsd样式的许可证下,有关详细信息,请参见许可证。

来源:https://github.com/gterzian/django_async.git

要求

  • 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”,将该对象绑定到模型的实例。最后,您可以保存模型实例。

如何在项目中使用它

此应用程序的功能位于“保存图像”功能中,可在如下视图中使用。 函数解构图像并将数据发送到异步保存任务。请不要让任务清除缓存。在我看来这是必要的,因为 仅仅将映像添加到实例并不会使缓存失效,就像创建新实例一样,因此在缓存超时之前,用户不会看到保存的映像。 因此,清除任务中的缓存似乎是必要的。

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))

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

推荐PyPI第三方库


热门话题
java限制C++代码访问JNI中的某些类   Android上的java DateFormat:不可解析的日期   通过json进行java迭代,并为其他请求调用多个API   Netbeans中的java JavaFX项目引发异常“输入流不能为null”   多线程Java newFixedThreadPool解释   |在java字符串中无法识别。split()方法   Java中的原始包装器类是否被视为引用类型?   Java swing。如何在intellij idea GUI设计工具中重写组件方法   数组乘矩阵   java将30GB的XML文件分割成小块XML   java通过一棵树递归找到一个节点,并返回指向该节点的路径   java如何将可观察的<Observable<List<T>>转换为可观察的<List<T>>   使用java在web服务器上更改php文件中的字符串?   java希望开发像tomcat这样的servlet容器   java希望提高编程的数学技能