2017-06-20 117 views
0

在我的Django网站上,用户上传照片和其他评论。目前,整个上传过程都是阻止呼叫。相反,我想将其移动到一个芹菜队列并异步执行。对于这一点,我只需调用从views.py如下:异步处理图像(Django)

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

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

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

如果在任务中您有其他一些代码来处理图像,例如,最好只在代码中留下此代码并在视图中创建对象。