使用芹菜和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 Spring数据JPA+Hibernate在不首先找到父实体的情况下保存子实体   php Java:如何从CLI接收命令   spring为java中的导出数据创建访问文件   java在Windows 8.1上安装Play Framework   java Spring启动白标签错误页面(类型=未找到,状态=404)   java如何在单击时从数组中绘制?   java fn:substringAfter()上次出现   java在IFR语句中使用方法返回   java onPause()或onStop()的名称   对关联对象的关联对象具有条件的java HQL查询   java只打印一次总值,无需迭代   java如何使用抽象Uri buildOn()方法?   如何在Java中执行sudo命令并获得错误输出?   java反射:避免对getConstructor(类<?>…)的未经检查的警告调用作为原始类型类的成员   Java:如何从类中创建的对象调用类方法?   java如何在电子邮件中嵌入图像?   java如何在Android上启用详细GC?   java什么是串行版本id?