关于flask入门教程-记录集转jsonify

article/2025/9/12 12:04:49

Flask 框架里,可以用 jsonify 返回 json 数据,但是为什么不用 Python 自带的 json 模块返回 JSON 数据呢?

其实两者是差不多的,jsonify指明了Content-Type 是 application/json , 这样做是符合 HTTP 协议的规定的,这就是使用 jsonify 的原因之一。

6e00a36645dca83ccfaee71c7b23c6a1.png

但是从数据集转jsonify有很多坑需要踩,本文就是数据集转jsonify踩坑指南和数据集转jsonify处理的几种办法,互联网上零零散散的也有,但都是语焉不详。

import config
from exts import db
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from flask import jsonify, make_responseapp = Flask(__name__)
# 从config.py文件中获取数据库配置信息
app.config.from_object(config)
db = SQLAlchemy(app)@app.route('/weather', methods=['GET', 'POST'])
def getjson():
pass
if __name__ == '__main__':app.run()

下面代码封装了一个将记录集和数据字段名称转换为字典列表的函数,通过cursor.description获取数据字段元数据,通过zip将字段名和结果封装起来。

def rows_as_dicts(cursor):# 将游标集转换为字典类型列表col_names = [i[0] for i in cursor.description]return [dict(zip(col_names, row)) for row in cursor]

下面代码是通过mappings方法将结果集转换为字典列表

sql = "select userid,username,password,personalname,birthday,sex,phone,postcard,address from userinfo "
result = db.session.execute(sql)
# 1、mappings方式,最简单直接
results_as_dict = result.mappings().all()
# [{'userid': 1, 'username': 'admin', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'birthday': '1976-11-08', 'sex': '男', 'phone': 'eeee', 'postcard': 'dddd', 'address': '44444444'},
# {'userid': 2, 'username': 'admin1', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'birthday': '1976-11-03', 'sex': '男', 'phone': '', 'postcard': '', 'address': '423'},
# ...
# {'userid': 17, 'username': 'admin33333', 'password': '1qaz!QAZ', 'personalname': '333', 'birthday': '2022-02-17', 'sex': '男', 'phone': '3333', 'postcard': '333', 'address': '333333'}]

下面是数据集操作返回的数据类型

result = db.session.execute(sql)
print('result=', result)
# result= <sqlalchemy.engine.cursor.CursorResult object at 0x0000025FF5B36438>
print('type(result)=', type(result))
# type(result)= <class 'sqlalchemy.engine.cursor.CursorResult'>
result = db.session.execute(sql).fetchall()
print('result=', result)
# result= [(1, 'admin', '1qaz!QAZ', 'adminstrator', '1976-11-08', '男', 'eeee', 'dddd', '44444444'),
# (2, 'admin1', '1qaz!QAZ', 'adminstrator', '1976-11-03', '男', '', '', '423'),
print('type(result)=', type(result))
# type(result)= <class 'list'>
result = db.session.execute(sql).cursor
print('result=', result)
# result= <sqlite3.Cursor object at 0x0000025FF5AC6B20>
print('type(result)=', type(result))
# type(result)= <class 'sqlite3.Cursor'>

通过rows_as_dicts转换为字典列表

# 2、自定义函数,将游标集转换为字典列表
cursor = db.session.execute(sql).cursor
result = rows_as_dicts(cursor)
# [{'userid': 1, 'username': 'admin', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'birthday': '1976-11-08', 'sex': '男', 'phone': 'eeee', 'postcard': 'dddd', 'address': '44444444'},
# {'userid': 2, 'username': 'admin1', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'birthday': '1976-11-03', 'sex': '男', 'phone': '', 'postcard': '', 'address': '423'},
# ...
# {'userid': 17, 'username': 'admin33333', 'password': '1qaz!QAZ', 'personalname': '333', 'birthday': '2022-02-17', 'sex': '男', 'phone': '3333', 'postcard': '333', 'address': '333333'}]

下面是分步骤获取数据操作返回的数据和数据类型

# 关于cursor和cursor.description介绍
cursor = db.session.execute(sql).cursor
# cursor.description返回元祖类型元数据
# print('cursor.description=',cursor.description)
# (('userid', None, None, None, None, None, None),
# ('username', None, None, None, None, None, None),
# ('password', None, None, None, None, None, None),
# ...
# ('address', None, None, None, None, None, None))
# [i[0] for i in cursor.description],通过迭代获取元数据信息
# print('[i[0] for i in cursor.description]=',[i[0] for i in cursor.description])
# ['userid', 'username', 'password', 'personalname', 'birthday', 'sex', 'phone', 'postcard', 'address']
# print('[row for row in cursor]=',[row for row in cursor])
#  [(1, 'admin', '1qaz!QAZ', 'adminstrator', '1976-11-08', '男', 'eeee', 'dddd', '44444444'),
# (2, 'admin1', '1qaz!QAZ', 'adminstrator', '1976-11-03', '男', '', '', '423'),
# ...
# (17, 'admin33333', '1qaz!QAZ', '333', '2022-02-17', '男', '3333', '333', '333333')]
# db.session.execute返回CursorResult
r = db.session.execute(sql)
# db.session.execute(sql)= <sqlalchemy.engine.cursor.CursorResult object at 0x0000020353A069B0>
# 通过fetchall()获取记录集
result = r.fetchall()
# [(1, 'admin', '1qaz!QAZ', 'adminstrator', '1976-11-08', '男', 'eeee', 'dddd', '44444444'),
# (2, 'admin1', '1qaz!QAZ', 'adminstrator', '1976-11-03', '男', '', '', '423')
# ...
# (17, 'admin33333', '1qaz!QAZ', '333', '2022-02-17', '男', '3333', '333', '333333')]

下面是结合cursor.description和结果集生成字典列表

# 3、通过
resultproxy = db.session.execute(sql)
resultdict = []
# resultproxy= <sqlalchemy.engine.cursor.CursorResult object at 0x000001D48DB93B00>
# resultproxy.keys= <bound method _WithKeys.keys of <sqlalchemy.engine.cursor.CursorResult object at 0x000001D48DB93B00>>
colname = [i[0] for i in cursor.description]
print('colname=', colname)
for rowproxy in resultproxy:rowresult = dict(zip(colname, rowproxy))# rowproxy= (1, 'admin', '1qaz!QAZ', 'adminstrator', '1976-11-08', '男', 'eeee', 'dddd', '44444444')# rowproxy type= <class 'sqlalchemy.engine.row.Row'># rowresult= {'userid': 1, 'username': 'admin', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'birthday': '1976-11-08', 'sex': '男', 'phone': 'eeee', 'postcard': 'dddd', 'address': '44444444'}resultdict.append(rowresult)
# rowresult =
# [{'userid': 1, 'username': 'admin', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'birthday': '1976-11-08', 'sex': '男', 'phone': 'eeee', 'postcard': 'dddd', 'address': '44444444'},
# {'userid': 2, 'username': 'admin1', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'birthday': '1976-11-03', 'sex': '男', 'phone': '', 'postcard': '', 'address': '423'},
# ...
# {'userid': 17, 'username': 'admin33333', 'password': '1qaz!QAZ', 'personalname': '333', 'birthday': '2022-02-17', 'sex': '男', 'phone': '3333', 'postcard': '333', 'address': '333333'}]

下面是讲字典列表json化,并通过response响应回前端的两种方式

# jsonify及返回响应的两种方法
# 1、通过构造response方式
response = jsonify(resultdict)
response.status_code = 200  # or 400 or whatever
# ---------------response.data----------------
print('response.data',response.data)
# response.data b'[{"address":"44444444","birthday":"1976-11-08","password":"1qaz!QAZ","personalname":"adminstrator","phone":"eeee","postcard":"dddd","sex":"\\u7537","userid":1,"username":"admin"},
# {"address":"423","birthday":"1976-11-03","password":"1qaz!QAZ","personalname":"adminstrator","phone":"","postcard":"","sex":"\\u7537","userid":2,"username":"admin1"},
# ...
# {"address":"333333","birthday":"2022-02-17","password":"1qaz!QAZ","personalname":"333","phone":"3333","postcard":"333","sex":"\\u7537","userid":17,"username":"admin33333"}]\n'
# ---------------response.json----------------
# response.json [{'address': '44444444', 'birthday': '1976-11-08', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'phone': 'eeee', 'postcard': 'dddd', 'sex': '男', 'userid': 1, 'username': 'admin'}, 
# {'address': '423', 'birthday': '1976-11-03', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'phone': '', 'postcard': '', 'sex': '男', 'userid': 2, 'username': 'admin1'}, 
# ... 
# {'address': '333333', 'birthday': '2022-02-17', 'password': '1qaz!QAZ', 'personalname': '333', 'phone': '3333', 'postcard': '333', 'sex': '男', 'userid': 17, 'username': 'admin33333'}]
# response.headers Content-Type: application/json
# Content-Length: 3012
# ---------------response.headers----------------
# response.headers Content-Type: application/json
# ---------------response.status_code----------------
# response.status_code 200
# ---------------response.content_length----------------
# Content-Length: 3012
return response# 2、通过make_response方式
# return make_response(jsonify(resultdict), 200)

http://chatgpt.dhexx.cn/article/Xw2EJ60C.shtml

相关文章

Flask 的 jsonify 理解

文章目录 python 代码解决原因Content-Type的区别 python 代码 # -*- coding:utf-8 -*- from flask import Flask, jsonifyapp Flask(__name__)urls [{id: 1,title: python,description: https://www.python.org/},{id: 2,title: flask,description: https://flask.palletsp…

Flask中jsonify和json.dumps用法以及区别(简单案例)

环境&#xff1a;python3.6, Flask1.0.3 flask提供了jsonify函数供用户处理返回的序列化json数据&#xff0c; 而python自带的json库中也有dumps方法可以序列化json对象. 其二者的区别&#xff0c;写个简单的案例实测一下便见分晓。 from flask import Flask from flask im…

const常量函数详解

在类中&#xff0c;如果你不希望某些数据被修改&#xff0c;可以使用const关键字加以限定。const 可以用来修饰成员变量和成员函数。 const常量与指针 const int *p1与const int *p2的顺序不同&#xff0c;但是他们指向的值都不能改变&#xff0c;上述代码说明虽然指向的值不能…

C++const函数的运用:深度解析const函数的魅力

C 深度解析const函数的魅力 1. C const函数的基本概念&#xff08;Basic Concepts of const Functions in C&#xff09;1.1 const函数的定义与特性&#xff08;Definition and Characteristics of const Functions&#xff09;1.2 const函数的使用场景&#xff08;Usage Scena…

const 用法

const 用法 const 修饰变量&#xff0c;这个变量被称为常变量&#xff0c;不能被修改&#xff0c;但本质上还是一个变量 #通过指针改变num的值 int main() {int num 10;int* p &num;*p 20;printf("%d ", num);return 0; }#这里num被 const修饰本来不能被修改…

const成员函数

const成员函数 const修饰成员函数的时候&#xff0c;const需要放在成员函数的后面&#xff0c;不能放在一开始&#xff0c;如果放在一开始的话&#xff0c;那么const其实是在修饰成员函数的返回值&#xff0c;而不是在修饰成员函数了 const成员函数中不能修改成员变量 普通成员…

const函数

const是衡量一个程序员是否老道的一个标准&#xff0c;除了修饰变量之外&#xff0c;还可以修饰函数&#xff0c;主要有以下几种形式 const int& fun(int& a); //修饰返回值 int& fun(const int& a); //修饰形参 int& fun(int& a) const{} //const成员…

梳理c++ const 修饰函数

const是衡量一个程序员是否老道的一个标准&#xff0c;除了修饰变量之外&#xff0c;还可以修饰函数&#xff0c;主要有以下几种形式 const int& fun(int& a); //修饰返回值 int& fun(const int& a); //修饰形参 int& fun(int& a) const{} //const成员…

C++基础——const成员函数

目录 一.Const成员函数 1.定义&#xff1a; 2.格式&#xff1a; 3.代码示例&#xff1a; .h文件&#xff1a; definition.cpp文件 特性&#xff1a; 例&#xff1a; 那么const对象既可以调用非const型成员函数吗&#xff1f; 问题3.const成员函数内可以调用其它…

JAVA输入/输出流详细讲解

应用程序经常需要访问文件和目录&#xff0c;读取文件信息或写入信息到文件&#xff0c;即从外界输入数据或者向外界传输数据&#xff0c;这些数据可以保存在磁盘文件、内存或其他程序中。在Java中&#xff0c;对这些数据的操作是通过I/O技术来实现的。所谓I/O技术&#xff0c;…

java输出语句_java输入输出语句是什么

在java中,输入语句为“Scanner对象.next()系列方法”,例“Scanner对象.nextLine()”表示输入字符串;输出语句为“System.out.println()”、“System.out.print()”等。 对于经常上机刷题的来说,首先得解决输入输出方法,Java的输入输出流在Java学习过程的后面部分才会接触,…

Java输入输出处理

活动地址&#xff1a;CSDN21天学习挑战赛 &#x1f341;博客主页&#xff1a;&#x1f449;不会压弯的小飞侠 ✨欢迎关注&#xff1a;&#x1f449;点赞&#x1f44d;收藏⭐留言✒ ✨系列专栏&#xff1a;&#x1f449;21天挑战回顾java ✨知足上进&#xff0c;不负野心。 &am…

java 输入输出总结(牛客、笔试、机试)

因为踩过坑&#xff0c;所以特别整理了一下&#xff0c;发现其实不少小伙伴同样都是这样&#xff0c;特别简单小结一下&#xff0c;java网上笔试的时候OJ的一些要求的实例 1 单行输入 // 本题为考试单行多行输入输出规范示例&#xff0c;无需提交&#xff0c;不计分。 import j…

java输入输出的方法

java输入输出 目录 一、控制台输入输出 二、文件读写 一、控制台输入输出 java控制台的输入输出主要依赖于scanner类&#xff0c;使用Scanner scannernew Scanner(System.in)获取了控制台输入的字段&#xff0c;其中system.in就表示这个对象读取的是控制台。 public static …

java读取输出流_Java输入输出流

1什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作。Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。 Ja…

Java 输入输出流学习总结

文章目录 前言&#xff1a;为什么要有输入输出流一、Java 的标准输入输出标准输入 System.in标准输出 System.out程序 exp8_3&#xff1a;简单的输入输出 二、输入输出流框架三、输入输出流类的应用课本程序 exp8.4改写 exp8.4(1)改写 exp_8.4(2) 四、RandomAccessFile 类输入输…

java 输入输出流

java I/O流 在java中所有数据都是使用流读写的。流是一组有序的数据序列&#xff0c;将数据从一个地方带到另一个地方。根据数据流向的不同&#xff0c;可以分为输入&#xff08;Input&#xff09;流和输出&#xff08;Output&#xff09;流两种。 为什么要使用输入输出流 例…

Java(2)-Java IO输入输出流

一.什么是IO Java中I/O操作主要是指使用Java进行输入&#xff0c;输出操作. Java所有的I/O机制都是基于数据流进行输入输出&#xff0c;这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读…

Java——输入输出

本篇主要介绍Java的输入与输出&#xff0c;当然&#xff0c;这里说的是控制台下的输入与输出&#xff0c;窗口程序的设计将会再后续篇章中有详细说明。   Java的输出很简单&#xff0c;调用System.out.println()即可打印输出你想要输出的内容。我们之前也已经看到过。调用pr…

C语言之static关键字详解

目录 前言&#xff1a; 一、几个概念 1.变量 2.局部变量和全局变量 3.变量的作用域 4.变量的生命周期 二、static关键字的作用 三、static关键字修饰局部变量 四、static关键字修饰全局变量 五、static关键字修饰函数 写在最后&#xff1a; 前言&#xff1a; static&am…