前提・実現したいこと
djangoで作成したアプリで画像のアップロードをする際、
以下のサイトを参考にdjango-rqで非同期処理のコードを追加したところ、
表題のエラーが発生しました。
どうすればエラーが解消できるのか分からない為、
何方か知見のある方がおりましたらご教示お願い致します。
※redis-server、RQのworkerは起動できています。
↓参考サイト
https://leben.mobi/blog/django_rq_hidouki/python/
発生している問題・エラーメッセージ
Internal Server Error: /upload/
TypeError: cannot serialize '_io.BufferedRandom' object
Internal Server Error: /upload/ Traceback (most recent call last): File "C:\Users\map\anaconda3\envs\app-test\lib\site-packages\django\core\handlers\exception.py ", line 34, in inner response = get_response(request) File "C:\Users\map\anaconda3\envs\app-test\lib\site-packages\django\core\handlers\base.py", li ne 115, in _get_response response = self.process_exception_by_middleware(e, request) File "C:\Users\map\anaconda3\envs\app-test\lib\site-packages\django\core\handlers\base.py", li ne 113, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "C:\Users\map\anaconda3\envs\app-test\lib\site-packages\django\contrib\auth\decorators.py ", line 21, in _wrapped_view return view_func(request, *args, **kwargs) File "C:\Users\map\PycharmProjects\app-test\map\views.py", line 177, in upload rq_test.delay(fname) File "C:\Users\map\anaconda3\envs\app-test\lib\site-packages\rq\decorators.py", line 64, in de lay meta=self.meta, description=self.description) File "C:\Users\map\anaconda3\envs\app-test\lib\site-packages\django_rq\queues.py", line 68, in enqueue_call return self.original_enqueue_call(*args, **kwargs) File "C:\Users\map\anaconda3\envs\app-test\lib\site-packages\django_rq\queues.py", line 64, in original_enqueue_call return super(DjangoRQ, self).enqueue_call(*args, **kwargs) File "C:\Users\map\anaconda3\envs\app-test\lib\site-packages\rq\queue.py", line 286, in enqueu e_call job = self.enqueue_job(job, at_front=at_front) File "C:\Users\map\anaconda3\envs\app-test\lib\site-packages\rq\queue.py", line 355, in enqueu e_job job.save(pipeline=pipe) File "C:\Users\map\anaconda3\envs\app-test\lib\site-packages\rq\job.py", line 522, in save connection.hmset(key, self.to_dict(include_meta=include_meta)) File "C:\Users\map\anaconda3\envs\app-test\lib\site-packages\rq\job.py", line 473, in to_dict obj['data'] = zlib.compress(self.data) File "C:\Users\map\anaconda3\envs\app-test\lib\site-packages\rq\job.py", line 221, in data self._data = dumps(job_tuple) TypeError: cannot serialize '_io.BufferedRandom' object
該当のソースコード
settingsの抜粋
settings
1INSTALLED_APPS = [ 2 # 非同期で追加 3 'django_rq', 4] 5 6# 非同期で追加 7RQ_QUEUES = { 8 'default': { 9 'HOST': 'localhost', 10 'PORT': 6379, 11 'DB': 0, 12 'PASSWORD': '', 13 'DEFAULT_TIMEOUT': 360, 14 }, 15} 16RQ_API_TOKEN = 'rq_result'
viewsの抜粋
views
1def upload(request): 2 t1 = time.time()# 時間計測用 3 if request.method == 'POST': 4 form = imgForm(request.POST, request.FILES) 5 if form.is_valid(): 6 for fname in request.FILES.getlist('image'): 7 rq_test.delay(fname) 8 object_list = upl_imgs.objects.all().order_by('-pk') 9 10 context = { 11 # 非同期で追加 12 'object_list': object_list, 13 } 14 else: 15 form = imgForm() 16 context = { 17 'form': form, 18 } 19 return render(request, 'map/upload.html', context) 20 21# 非同期で追加 22from django_rq import job 23@job 24def rq_test(fname): 25 im = Image.open(fname) # 画像サイズ取得のため実施 26 size = str(im.size[0]) + "x" + str(im.size[1]) # 画像サイズ 27 28 try: 29 dto = inside_judge(fname)[2] # 撮影日時 30 refname = dto + ".JPG" 31 except: 32 error_list.append(fname) 33 34 upl_imgs.objects.create(date=dto, image=refname, size=size) 35
urlsの抜粋
urls
1urlpatterns = [ 2 # 非同期で追加 3 path('django-rq/', include('django_rq.urls')), 4]
試したこと
celeryは起動ができなかった。
補足情報(FW/ツールのバージョンなど)
windows10
django 3.0.7
python 3.6.10
django-rq 2.2.0
rq 1.1.0
※UnpickleErrorのimporterrorが発生した為、1.7.0からダウングレードした
あなたの回答
tips
プレビュー