Flask返回按值排序的字典自动变为字母序,如何保留排序结果?
问题原因
你本地打印排序后的字典顺序正常,但Flask接口返回自动按键排序,核心原因是Flask默认的JSON序列化规则强制开启了按键字母排序的配置:
- Python 3.7及以上版本的原生字典默认保留插入顺序,所以你本地打印
sorted_top_five顺序是对的 - 但Flask在将返回的字典转换为JSON响应时,默认启用了
sort_keys=True参数,会无视字典本身的插入顺序,强制按key的字母序重新排列输出。
解决方案
分几种场景可选:
方案1:全局关闭Flask的JSON键排序配置
直接在初始化Flask app的代码里加配置即可,不同版本写法略有区别:# Flask 2.3 及以上版本写法 app = Flask(__name__) app.json.sort_keys = False # Flask 2.3 以下版本写法 app = Flask(__name__) app.config['JSON_SORT_KEYS'] = False配置后所有接口返回字典都会保留原有插入顺序,不需要修改你现有接口的业务代码。
方案2:仅针对当前接口保留排序,不影响全局配置
不需要改全局配置,直接在当前接口里手动完成JSON序列化,指定不排序后返回响应即可:from flask import Response import json @app.route('/volume') def print_volume(): # 你原有业务代码不变 url = "https://api.korbit.co.kr/v1/ticker/detailed/all" resp = requests.get(url) obj = resp.json() total_vol = 0.0 for i in obj: total_vol += float(obj[i]['volume']) dict_vol = {} for i in obj: dict_vol[i[0]] = i[1]['volume'] sorted_top_five = dict( sorted(dict_vol.items(), key=lambda item: item[1], reverse=True)) print(sorted_top_five) # 手动序列化返回,关闭键排序 return Response( json.dumps(sorted_top_five, ensure_ascii=False, sort_keys=False), mimetype='application/json' )兼容Python 3.7以下版本
如果你使用的Python版本低于3.7,原生字典不保留插入顺序,需要将排序后的结果存为collections.OrderedDict再返回,同时搭配上面的关闭排序配置即可:from collections import OrderedDict # 排序时用OrderedDict代替原生dict sorted_top_five = OrderedDict( sorted(dict_vol.items(), key=lambda item: item[1], reverse=True))
内容的提问来源于stack exchange,提问作者jun
相关产品推荐
相关产品推荐

