数据库数据转json字符串及ajax请求数据渲染

续接:1.使用web框架程序处理客户端的动态资源请求代码实现 

           2.web框架之路由列表及SQL语句查询数据库数据替换模板变量

一、数据库数据转json字符串

web框架程序可以开发数据接口,为客户端程序提供数据服务,步骤如下

  1. 根据sql语句查询数据库
  2. 把数据转成json字符串返回
  3. 浏览器通过指定接口地址获取web框架提供的数据
  • 字符串转换:json.dumps(指定对象,ensure_ascii=False)
    • 第一个参数表示要把指定对象转成json字符串
    • ensure_ascii=False表示不使用ascii编码,可以在控制台显示中文

webFrame.py文件如下

import json
import pymysql
route_list = []  # 定义路由列表
def route(path):   # 定义带参数的装饰器
    def outFunc(func):  # 装饰器
        route_list.append((path, func))   # 执行装饰器装饰指定函数时,将路径和函数追加到路由列表
        def inFunc():
            return func()  # 执行指定函数
        return inFunc
    return outFunc    # 返回装饰器

@route('/center.html')
def center():  # 获取个人中心数据
    status = "200 OK 成功状态!"   # 响应状态
    response_header = [("Server", "PWS2.0"), ("Content-Type", "text/html;charset=utf-8")]   # 响应头,需加上("Content-Type", "text/html;charset=utf-8"),指定编码格式,否则中文乱码

    # 查询数据库
    # 创建连接对象
    conn = pymysql.connect(host="localhost", port=3306, user='root', password='******', database='python_sql',
                           charset='utf8')
    cur = conn.cursor()  # 获取游标对象
    sql = 'select s.name,s.age,s.gender,t.NAME from students as s inner join student2 as t on s.id=t.id;'  # 查询SQL语句
    rowCount = cur.execute(sql)  # 执行SQL语句,返回执行过程中影响的行数
    print('SQL语句执行过程中影响的行数为%d' % rowCount)
    result = cur.fetchall()
    print("数据库查询结果为:", result)

    # 将元祖转为列表字典
    resultToList = [{
        'name': i[0],
        'age': i[1],
        'gender': i[2],
        'NAME': i[3]
    } for i in result]
    print('转为列表字典后结果为:', resultToList, '类型为:', type(resultToList))
    json_str = json.dumps(resultToList, ensure_ascii=False)   # 将列表转为json字符串数据,ensure_ascii=False表示能够显示中文
    print('转为json字符串后的数据为:', json_str, '类型为:', type(json_str))  # 浮点数不能序列化需先转为字符串
    cur.close()  # 关闭游标
    conn.close()  # 关闭连接
    return status, response_header, json_str

def notFound():  # 没有找到动态资源请求
    status = "404 not found 资源不存在"
    response_header = [("server"), "pws2.0"]
    data = "not found"
    return status, response_header, data

def handle_request(env):   # 处理动态资源请求
    request_path = env["request_path"]   # 通过key关键字request_path获取值
    print("接收到的动态资源请求路径为:", request_path)
    for path, func in route_list:
        if request_path == path:
            result = func()
            return result

    else:  # 没有找到动态资源
        result = notFound()
        return result
# if __name__ == '__main__':   # 测试查询打印数据库数据用
#     center()

center.html文件如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>个人中心</title>
</head>
<body>
<h2>这里是个人中心页面</h2>
<h3>{% DATE %}</h3>
</body>
</html>

 数据库查询结果如下

 输出结果如下 

……以上省略
…… 
拆包前: ('200 OK 成功状态!', [('Server', 'PWS2.0'), ('Content-Type', 'text/html;charset=utf-8')], '[{"name": "XY", "age": 20, "gender": "男", "NAME": "yx"}, {"name": "YX", "age": 18, "gender": "女", "NAME": "XYY"}, {"name": "XY", "age": 18, "gender": null, "NAME": "yxx"}]')
接收到的动态资源请求路径为: /center.html
SQL语句执行过程中影响的行数为3
数据库查询结果为: (('XY', 20, '男', 'yx'), ('YX', 18, '女', 'XYY'), ('XY', 18, None, 'yxx'))
转为列表字典后结果为: [{'name': 'XY', 'age': 20, 'gender': '男', 'NAME': 'yx'}, {'name': 'YX', 'age': 18, 'gender': '女', 'NAME': 'XYY'}, {'name': 'XY', 'age': 18, 'gender': None, 'NAME': 'yxx'}] 类型为: <class 'list'>
转为json字符串后的数据为: [{"name": "XY", "age": 20, "gender": "男", "NAME": "yx"}, {"name": "YX", "age": 18, "gender": "女", "NAME": "XYY"}, {"name": "XY", "age": 18, "gender": null, "NAME": "yxx"}] 类型为: <class 'str'>
拆包后status, headers, response_body分别为: 200 OK 成功状态! [('Server', 'PWS2.0'), ('Content-Type', 'text/html;charset=utf-8')] [{"name": "XY", "age": 20, "gender": "男", "NAME": "yx"}, {"name": "YX", "age": 18, "gender": "女", "NAME": "XYY"}, {"name": "XY", "age": 18, "gender": null, "NAME": "yxx"}]
comm_socket, ip_port值为: <socket.socket fd=756, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9000), raddr=('127.0.0.1', 54585)> 和 ('127.0.0.1', 54585)

center.html页面JSON字符串数据如下 

响应头添加("Content-Type", "text/html;charset=utf-8")后显示正常,其用来指定编码格式

二、ajax请求center.html中数据渲染到showCenter.html页面

在webFrame.py中添加showCenter()函数

@route('/showCenter.html')
def showCenter():  # 获取个人中心数据
    status = "200 OK 成功状态!"   # 响应状态
    response_header = [("Server", "PWS2.0"), ("Content-Type", "text/html;charset=utf-8")]   # 响应头,需加上("Content-Type", "text/html;charset=utf-8"),指定编码格式,否则中文乱码
    with open("templates/showCenter.html", "r", encoding='utf-8') as file:
        file_date = file.read()
    result = file_date.replace("{%Date%}", "")
    return status, response_header, result

showCenter.html文件如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>获取个人中心数据</title>
    <!--    以下路径与webServer.py中的静态资源请求路径拼接-->
    <link rel="stylesheet" href="/plugins/bootstrap-3.4.1-dist/css/bootstrap.min.css">
    <script type="text/javascript" src="/js/jquery-3.4.1.min.js"></script>
    <script type="text/javascript" src="/plugins/bootstrap-3.4.1-dist/js/bootstrap.min.js"></script>
    <script>
        $(document).ready(function () {
            var tbody = $(".tbody")
            // 发送Ajax请求,获取center.html中数据
            $.get("center.html", function (data) { // 此处为本地请求,实际形式为http://ip地址:端口号/center.html
                for (var i = 0; i < data.length; i++) {
                    var oneData = data[i];  // 根据下标获取每个js对象
                    var oneLine = '<tr>' +
                        '<td>' + oneData.name + '</td>' +
                        '<td>' + oneData.age + '</td>' +
                        '<td>' + oneData.gender + '</td>' +
                        '<td>' + oneData.NAME + '</td>' +
                        '</tr>'
                    tbody.append(oneLine)   // 为table表中tbody追加每一行数据
                }
            }, "json");   // 指定以json格式解析,则以上data为一个json对象
        })
    </script>
</head>
<body>
<div class="container">
    <h2>ajax请求center.html中数据渲染</h2>
    <table class="table table-bordered">
        <thead>
        <tr>
            <th>name</th>
            <th>age</th>
            <th>gender</th>
            <th>NAME</th>
        </tr>
        </thead>
        <tbody class="tbody">
        {%Date%}
        </tbody>
    </table>
</div>
</body>
</html>

学习导航:http://xqnav.top/

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,您可以使用JavaScript的DOM操作来将JSON数据渲染HTML页面上。以下是一个简单的示例: 假设您已经通过AJAX请求从服务器获取了一个名为"data.json"的JSON文件,并且它包含以下内容: ```json { "students": [ { "name": "Tom", "age": 18, "gender": "male" }, { "name": "Lucy", "age": 19, "gender": "female" }, { "name": "Jack", "age": 20, "gender": "male" } ] } ``` 您可以使用以下JavaScript代码将这些数据渲染HTML页面上: ```javascript // 发送AJAX请求获取JSON数据 var xhr = new XMLHttpRequest(); xhr.open('GET', 'data.json', true); xhr.onload = function() { if (xhr.status === 200) { var data = JSON.parse(xhr.responseText); var students = data.students; // 获取HTML元素 var ul = document.getElementById('student-list'); // 遍历JSON数据,创建HTML元素并添加到页面中 for (var i = 0; i < students.length; i++) { var li = document.createElement('li'); li.textContent = students[i].name + ', ' + students[i].age + ', ' + students[i].gender; ul.appendChild(li); } } }; xhr.send(); ``` 在这个代码中,我们首先发送一个AJAX请求以获取JSON数据。然后,我们使用`JSON.parse()`方法将JSON字符串解析为JavaScript对象,并从中获取我们需要的数据。接下来,我们使用`document.getElementById()`方法获取要添加数据HTML元素,并使用`document.createElement()`方法创建新的HTML元素。最后,我们将每个学生的信息添加到新的HTML元素中,并使用`appendChild()`方法将它们添加到HTML页面上。 请注意,这只是一个简单的示例。在实际项目中,您可能需要更复杂的逻辑来处理JSON数据,并使用更多的DOM操作来渲染它们。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

learning-striving

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值