2017-06-20 115 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查詢。如果媒體存儲在遠程服務器上,這可能是一種情況,但更好的是以其他方式實現它(將對象創建分爲兩部分等等)。

如果在任務中您有其他一些代碼來處理圖像,例如,最好只在代碼中留下此代碼並在視圖中創建對象。