在我的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参与的解决方案。
答案 0 :(得分:0)
要处理您的问题,您可以创建供芹菜使用的自定义JSON编码器,例如Celery: is there a way to write custom JSON Encoder/Decoder?所述。但这不是好方法。
但总的来说,这似乎是错误的解决方案。 如果你在任务中唯一做的就是创建对象 - 在视图中执行此操作。您只能跳过单个SQL查询。如果媒体存储在远程服务器上,这可能是一种情况,但最好以其他方式实现(将对象创建分为两部分等等)。
如果在任务中你有一些其他代码来处理图像,那么最好只将此代码留在task中并在视图中创建对象。