异步处理图像(Django)

时间:2017-06-20 16:46:28

标签: python django

在我的Django网站中,用户上传照片和其他人对其进行评论。目前,整个上传过程都是阻塞调用。所以相反,我想将它移动到芹菜队列并异步执行它。为此,我只需从views.py

调用以下内容
photo = form.cleaned_data.get('photo',None)
upload_photo.delay(photo, request.user.id)

然后在tasks.py,我有:

@celery_app1.task(name='tasks.upload_photo')
def upload_photo(photo_obj, user_id):
    photo = Photo.objects.create(image_file = photo_obj, owner_id=user_id)

现在,这可以预见,给了我一个EncodeError: <InMemoryUploadedFile: temp.jpg (image/jpeg)> is not JSON serializable。那么,为了在aysnc任务中做繁重的工作,这里有什么样的正确模式?一个说明性的例子非常有用。

P.S。如果它对回答者很重要,我正在寻找一个没有JS参与的解决方案。

1 个答案:

答案 0 :(得分:0)

要处理您的问题,您可以创建供芹菜使用的自定义JSON编码器,例如Celery: is there a way to write custom JSON Encoder/Decoder?所述。但这不是好方法。

但总的来说,这似乎是错误的解决方案。 如果你在任务中唯一做的就是创建对象 - 在视图中执行此操作。您只能跳过单个SQL查询。如果媒体存储在远程服务器上,这可能是一种情况,但最好以其他方式实现(将对象创建分为两部分等等)。

如果在任务中你有一些其他代码来处理图像,那么最好只将此代码留在task中并在视图中创建对象。