首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何说服Kombu使用simplejson而不是json模块?

我如何说服Kombu使用simplejson而不是json模块?
EN

Stack Overflow用户
提问于 2022-09-29 20:36:56
回答 1查看 211关注 0票数 1

有什么好方法可以说服Celery+Kombu使用simplejson而不是标准库的json模块?

我在听:

代码语言:javascript
复制
tact@tact_pub_api:/app$ python3.10 -m pip list -v | egrep -i 'celery|kombu'
celery                  5.2.3       /usr/local/lib/python3.10/site-packages pip
kombu                   5.2.4       /usr/local/lib/python3.10/site-packages pip
tact@tact_pub_api:/app$ python2.7 -m pip list -v | egrep -i 'celery|kombu'
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support pip 21.0 will remove support for this functionality.
celery                        3.1.26.post2 /usr/local/lib/python2.7/dist-packages pip
kombu                         3.0.37       /usr/local/lib/python2.7/dist-packages pip

...and,我得到了一个回溯:

代码语言:javascript
复制
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/kombu/serialization.py", line 39, in _reraise_errors
    yield
  File "/usr/local/lib/python3.10/site-packages/kombu/serialization.py", line 210, in dumps
    payload = encoder(data)
  File "/usr/local/lib/python3.10/site-packages/kombu/utils/json.py", line 68, in dumps
    return _dumps(s, cls=cls or _default_encoder,
  File "/usr/local/lib/python3.10/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/usr/local/lib/python3.10/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/local/lib/python3.10/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/usr/local/lib/python3.10/site-packages/kombu/utils/json.py", line 58, in default
    return super().default(o)
  File "/usr/local/lib/python3.10/json/encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type bytes is not JSON serializable

我听到的是,这是由于最近版本的Kombu使用python标准库的json模块,而不是pypi的simplejson模块(https://docs.celeryq.dev/projects/kombu/en/stable/changelog.html#rc1)造成的。显然,标准库的"json“模块不能(反)序列化字节,但是pypi的"simplejson”可以。Celery+Kombu的旧版本默认使用simplejson。

例:

代码语言:javascript
复制
>>> import json
>>> s = b'abc'
>>> json.dumps(s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.10/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "/usr/local/lib/python3.10/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/local/lib/python3.10/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/usr/local/lib/python3.10/json/encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type bytes is not JSON serializable

我的团队/项目最终可能会或不希望转移到json模块的序列化,但就目前而言,为了互操作性的考虑,使用simplejson似乎是最有意义的。

(这是一个大型的CPython 2.7 -> CPython 3.10端口的一部分;我只想先处理3.10,然后再担心更新依赖关系是现代的。现在,客户端和服务器都在不同版本的芹菜和贡布上)

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2022-10-01 15:23:35

也许您可以从代码中将kombu设置为monkeypatch,在导入代码之后,使用simplejson代替json。从上面的回溯:

代码语言:javascript
复制
File "/usr/local/lib/python3.10/site-packages/kombu/serialization.py", line 210, in dumps
    payload = encoder(data)

如果encoder是一个全局名称,那么将kombu.encoder重新绑定到使用simplejson的函数。如果不是,但dumps是,重新绑定kombu.dumps

或者,这对

代码语言:javascript
复制
File "/usr/local/lib/python3.10/site-packages/kombu/utils/json.py", line 68, in dumps
    return _dumps(s, cls=cls or _default_encoder,

建议您可以将kombu.utils.json.cls设置为“无”来更改行为。检查kombu文档或读取模块代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73901352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档