在我的一个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任务中完成繁重的任务,应该遵循什么模式呢?一个说明性的例子会很有帮助。
附注:如果这对回答者很重要,我正在寻找一个不涉及JS的解决方案。
发布于 2017-06-21 00:56:25
为了解决您的问题,您可以创建自定义的JSON编码器,以供芹菜使用,例如Celery: is there a way to write custom JSON Encoder/Decoder?。但这不是一个好的方法。
但总的来说,它看起来像是错误的解决方案。如果你在任务中做的唯一一件事就是创建对象--在视图中这样做。您只能跳过单个SQL查询。如果媒体存储在远程服务器上,这可能是一种情况,但最好用其他方式实现它(将对象创建分成两部分,等等)。
例如,如果在任务中有一些其他代码来处理图像,最好只将这些代码留在任务中,并在视图中创建对象。
https://stackoverflow.com/questions/44658817
复制相似问题