2016-01-20 49 views
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"] 

回答

1

對象是不是JSON序列化。如果在Linux上序列化成功,這表明您可能在那裏使用了pickle序列化方法。

我建議在Windows中使用pickle序列化方法,通過明確指定它使用here提到的方法之一。

+0

問題是,如果我將所有json替換爲pickle在設置中拒絕處理任務,因爲安全 –

+0

抱歉 - 這沒什麼意義。你是什​​麼意思「因爲安全」?你可以發佈錯誤消息,如果有的話? – scytale

+0

在這個問題相同ting http://stackoverflow.com/questions/27578235/pickle-is-refusing-to-serialize-content-with-celery-reporting-contentdisallowed提供的解決方案並沒有幫助我 –

相關問題