首页 > 解决方案 > JSONEncoder 仅在 Linux 中崩溃,原因是在 Windows 中不存在“意外的关键字参数“编码””

问题描述

在 Windows 中运行下面的代码可以完美运行,而在 Linux(Ubuntu)中它在ThingEncoder.__init__调用super().__init__(*args, **kwargs). 这次崩溃的原因是kwargs.

在 Windows 中,kwargs包含 8 个字段:

窗口字段

在 Linux 中,它是 18:

在此处输入图像描述

抛出的错误是:

__init__() got an unexpected keyword argument 'encoding'
[2021-01-04 12:04:31,233] ERROR in app: Exception on /things [GET]
Traceback (most recent call last):
File "/home/me/.local/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
File "/home/me/.local/lib/python3.8/site-packages/flask/app.py", line 1953, in full_dispatch_request
    return self.finalize_request(rv)
File "/home/me/.local/lib/python3.8/site-packages/flask/app.py", line 1968, in finalize_request
    response = self.make_response(rv)
File "/home/me/.local/lib/python3.8/site-packages/flask/app.py", line 2097, in make_response
    raise TypeError(
TypeError: The view function did not return a valid response. The function either returned None or ended without a return statement.
127.0.0.1 - - [04/Jan/2021 12:04:31] "GET /things HTTP/1.1" 500 -

encoding仅在 Linux 上运行时存在)。

这是代码:

from flask import jsonify, Flask
from json import JSONEncoder


class ThingEncoder(JSONEncoder):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs) # here is the crash!!
        print("test")

    def default(self, obj):
        # ...some logic...
        return JSONEncoder.default(self, obj)



app = Flask(__name__)
app.json_encoder = ThingEncoder


@app.route('/things', methods=['GET'])
def get_things():
    try:
        jsonify(id=str(7), pt="ZR")
        print("good")
    except Exception as e:
        print(e)


if __name__ == '__main__':
    app.run(host="0.0.0.0", port=5432)

除了疯狂的黑客作品,还有真正的解决方案吗?Windows/Linux 中不同行为的原因是什么?

更新:

@MacOS 下面的评论让我质疑.. 并回答:已安装的软件包之一对此负责。一个非必要的(因为它没有它也可以工作),它预装了 Python。我仍然需要确定是哪一个。希望快点更新。。。

标签: pythonpython-3.xflaskpython-3.8

解决方案


使用烧瓶 json

from flask import jsonify, Flask, json

class ThingEncoder(json.JSONEncoder):
    def default(self, obj):
        # ...some logic...
        return JSONEncoder.default(self, obj)

推荐阅读