2017-06-20 8 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

問題を処理するには、例えばCelery: is there a way to write custom JSON Encoder/Decoder?で説明したように、セロリで使用するカスタムJSONエンコーダを作成できます。しかし、これは良いアプローチではありません。

しかし、一般的には間違った解決策のように見えます。 あなたがタスクで行うのは、オブジェクトの作成だけです。これを表示します。単一のSQLクエリをスキップするだけです。メディアがリモートサーバーに格納されている場合、これが可能ですが、別の方法でオブジェクトを実装する方が優れています(オブジェクトを2つに分割するなど)。

たとえば、イメージを処理するための他のコードがあるタスクの場合は、タスク内にこのコードだけを残して、オブジェクトを表示することをお勧めします。