jsonify() 只是包装了json.dumps()。但是,根据您的 Flask 应用程序的配置和您使用的 Flask 版本,它可能会将indent=2 和separators=(', ', ': ') 传递给json.dumps。 (如果您不熟悉这些论点,请参阅https://docs.python.org/3/library/json.html 上关于漂亮打印的文档)。
传递这些参数会显着减慢json.dumps。使用来自 https://github.com/zemirco/sf-city-lots-json 的 181MB citylots.json 文件作为示例数据,这些漂亮的打印参数将 json.dumps() 在我的 MacBook Pro 上的运行时间从 7 秒增加到 31 秒:
>>> 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),或者
- 您正在调试模式下运行您的应用
(您可以在 https://github.com/pallets/flask/blob/1.0.2/flask/json/__init__.py#L309 的 Flask 1.0.2 代码中查看这些条件。)
如果您使用 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: # single args are passed directly to dumps()
data = args[0]
else:
data = args or kwargs
return current_app.response_class(
dumps(data) + '\n',
mimetype=current_app.config['JSONIFY_MIMETYPE']
)
如果您使用的是 Flask1.0 之前的版本,那么如果两者都发生,则会发生漂亮的打印:
- 您还没有在应用的配置中将
JSONIFY_PRETTYPRINT_REGULAR 明确设置为False(默认为True),并且
- 当前请求不是 XHR 请求
在那些旧版本中,永远不需要重新定义 jsonify 来消除漂亮的打印,因为你可以这样做:
app.config['JSONIFY_PRETTYPRINT_REGULAR'] = False
(或者,如果您使用的是 Flask 1.0 之前的版本,并且只想在生产中禁用漂亮打印,则无需更改代码;相反,只需升级到最新版本的 Flask。 )