2
我使用的是Django + Celery + Kombu + rabbitmq:我的任務已成功完成(Ubuntu 14.04)kombu.exceptions.EncodeError:[<Vkwallpost:Vkwallpost對象> ...不是JSON序列化 - 只在本地主機上
[2016-01-21 02:29:05,027: INFO/MainProcess] Task vk_wall.tasks.get_wallposts_by_owner_id[cbdfbdf7-1f01-4cf1-bd5a-77fae7a07003] succeeded in 7.826467196922749s: [<Vkwallpost: Vkwallpost object>, <Vkwallpost: Vkwallpost object>, <Vkwallpost: Vkwallpost object>, <Vkwallpost: Vkwallpost...
但在本地主機上(Windows 7)中使用相同的設置引發錯誤:
[2016-01-21 02:34:54,296: ERROR/MainProcess] Task vk_wall.tasks.get_wallposts_by_owner_id[5ecbf611-15d7-4b75-ac8e-2575b5dc869a] raised unexpected: EncodeError(TypeError(TypeError("[<Vkwallpost: Vkwallpost object>, <Vkwallpost: Vkwallpost object>, <Vkwallpost: Vkwallpost object>, <Vkwallpost: Vkwallpost object>, <Vkwallpost: Vkwallpost object>, <Vkwallpost: Vkwallpost object>, '...(remaining elements truncated)...'] is not JSON serializable",),),)
Traceback (most recent call last):
File "M:\WinPython-64bit-3.4.3.2\python-3.4.3.amd64\lib\site-packages\celery\app\trace.py", line 283, in trace_task
uuid, retval, SUCCESS, request=task_request,
File "M:\WinPython-64bit-3.4.3.2\python-3.4.3.amd64\lib\site-packages\celery\backends\amqp.py", line 136, in store_result
delivery_mode=self.delivery_mode,
File "M:\WinPython-64bit-3.4.3.2\python-3.4.3.amd64\lib\site-packages\kombu\messaging.py", line 165, in publish
compression, headers)
File "M:\WinPython-64bit-3.4.3.2\python-3.4.3.amd64\lib\site-packages\kombu\messaging.py", line 241, in _prepare
body) = dumps(body, serializer=serializer)
File "M:\WinPython-64bit-3.4.3.2\python-3.4.3.amd64\lib\site-packages\kombu\serialization.py", line 164, in dumps
payload = encoder(data)
File "M:\WinPython-64bit-3.4.3.2\python-3.4.3.amd64\lib\contextlib.py", line 77, in __exit__
self.gen.throw(type, value, traceback)
File "M:\WinPython-64bit-3.4.3.2\python-3.4.3.amd64\lib\site-packages\kombu\serialization.py", line 59, in _reraise_errors
reraise(wrapper, wrapper(exc), sys.exc_info()[2])
File "M:\WinPython-64bit-3.4.3.2\python-3.4.3.amd64\lib\site-packages\kombu\five.py", line 131, in reraise
raise value.with_traceback(tb)
File "M:\WinPython-64bit-3.4.3.2\python-3.4.3.amd64\lib\site-packages\kombu\serialization.py", line 55, in _reraise_errors
yield
File "M:\WinPython-64bit-3.4.3.2\python-3.4.3.amd64\lib\site-packages\kombu\serialization.py", line 164, in dumps
payload = encoder(data)
File "M:\WinPython-64bit-3.4.3.2\python-3.4.3.amd64\lib\site-packages\anyjson\__init__.py", line 141, in dumps
return implementation.dumps(value)
File "M:\WinPython-64bit-3.4.3.2\python-3.4.3.amd64\lib\site-packages\anyjson\__init__.py", line 89, in dumps
raise TypeError(TypeError(*exc.args)).with_traceback(sys.exc_info()[2])
File "M:\WinPython-64bit-3.4.3.2\python-3.4.3.amd64\lib\site-packages\anyjson\__init__.py", line 87, in dumps
return self._encode(data)
File "M:\WinPython-64bit-3.4.3.2\python-3.4.3.amd64\lib\site-packages\simplejson\__init__.py", line 370, in dumps
return _default_encoder.encode(obj)
File "M:\WinPython-64bit-3.4.3.2\python-3.4.3.amd64\lib\site-packages\simplejson\encoder.py", line 269, in encode
chunks = self.iterencode(o, _one_shot=True)
File "M:\WinPython-64bit-3.4.3.2\python-3.4.3.amd64\lib\site-packages\simplejson\encoder.py", line 348, in iterencode
return _iterencode(o, 0)
File "M:\WinPython-64bit-3.4.3.2\python-3.4.3.amd64\lib\site-packages\simplejson\encoder.py", line 246, in default
raise TypeError(repr(o) + " is not JSON serializable")
kombu.exceptions.EncodeError: [<Vkwallpost: Vkwallpost object>, <Vkwallpost: Vkwallpost object>, <Vkwallpost: Vkwallpost object>, <Vkwallpost: Vkwallpost object>, <Vkwallpost: Vkwallpost object>, <Vkwallpost: Vkwallpost object>, '...(remaining elements truncated)...'] is not JSON serializable
所以任務標爲未完成,但實際上任務完成所有的事,我需要。 我回顧了類似問題的答案:我的任務返回字典,即{'success':success}。它似乎試圖序列化Django模型實例的Vkwallpost對象,但是爲什麼。
我settings.py:
#BROKER_URL = 'amqp://guest:[email protected]//'
BROKER_URL = 'django://'
#: Only add pickle to this list if your broker is secured
#: from unwanted access (see userguide/security.html)
CELERY_ACCEPT_CONTENT = ['json', 'pickle']
CELERY_TASK_RESULT_EXPIRES=3600
#CELERY_RESULT_BACKEND='amqp'
CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend'
# postgresql
#CELERY_RESULT_BACKEND = 'db+postgresql://postgres:[email protected]/graphgrail'
#CELERY_RESULT_BACKEND='djcelery.backends.cache:CacheBackend',
CELERY_RESULT_SERIALIZER = 'json' #json pickle msgpack
CELERY_TASK_SERIALIZER = 'json'
CELERY_IMPORTS=["vk_wall.tasks"]
問題是,如果我將所有json替換爲pickle在設置中拒絕處理任務,因爲安全 –
抱歉 - 這沒什麼意義。你是什麼意思「因爲安全」?你可以發佈錯誤消息,如果有的話? – scytale
在這個問題相同ting http://stackoverflow.com/questions/27578235/pickle-is-refusing-to-serialize-content-with-celery-reporting-contentdisallowed提供的解決方案並沒有幫助我 –