jsonify()
只是包装了json.dumps()
。然而,根据您的Flask应用程序的配置和您使用的Flask版本,它可能会将indent=2
和separators=(', ', ': ')
传递给json.dumps
。(如果您不熟悉这些参数,请参阅漂亮打印文档https://docs.python.org/3/library/json.html)。
传递这些参数会大大减慢json.dumps
的速度。以181MB的citylots.json
文件为样本数据,来自https://github.com/zemirco/sf-city-lots-json,这些漂亮打印参数将json.dumps()
的运行时间从7秒增加到31秒,在我的MacBook Pro上:
>>> import time
>>> import json
>>> citylots = json.load(open('citylots.json'))
>>> start = time.time(); x = json.dumps(citylots); print(time.time() - start)
7.165302753448486
>>> x = None
>>> start = time.time(); x = json.dumps(citylots, indent=2, separators=(', ', ': ')); print(time.time() - start)
31.19125771522522
从Flask 1.0开始,如果以下任一条件成立,则会发生这种昂贵的漂亮打印:
- 您在应用程序配置中明确设置了
JSONIFY_PRETTYPRINT_REGULAR
为True
(默认情况下为False
),或者
- 您正在以调试模式运行应用程序。
(您可以在Flask 1.0.2代码中查看这些条件https://github.com/pallets/flask/blob/1.0.2/flask/json/__init__.py#L309。)
如果您使用的是Flask >=1.0,并且有(可能不寻常的)需要在调试模式下禁用漂亮的打印,您始终可以通过复制和粘贴内置的jsonify
定义并删除所有漂亮的打印逻辑来实现自己的jsonify
:
from flask import current_app
from json import dumps
def jsonify(*args, **kwargs):
if args and kwargs:
raise TypeError('jsonify() behavior undefined when passed both args and kwargs')
elif len(args) == 1:
data = args[0]
else:
data = args or kwargs
return current_app.response_class(
dumps(data) + '\n',
mimetype=current_app.config['JSONIFY_MIMETYPE']
)
如果您使用的是 Flask 1.0 以前的版本,则只有在以下两种情况下才会进行漂亮打印:
- 您没有在应用程序的配置中明确设置 JSONIFY_PRETTYPRINT_REGULAR 为 False(默认为 True),并且
- 当前请求不是 XHR 请求。
在这些旧版本中,永远不需要重新定义 jsonify 来消除漂亮打印,因为您可以这样做:
app.config['JSONIFY_PRETTYPRINT_REGULAR'] = False
如果你正在使用 Flask 的 1.0 版本之前的版本,并且只想在生产环境中禁用漂亮的打印输出,那么无需更改代码;相反,只需升级到最新版本的 Flask。