[Python]mini-Web框架(三)

简介: [Python]mini-Web框架(三)

7. 个人中心数据接口的开发

个人中心数据接口的开发,需要根据sql语句查询个人中心数据,然后将个人中心数据转成json字符串并返回。

python 数据类型与 json 类型的转化表:

来源:python中的元组与json类型转化问题

可以json.dumps函数把字典转成json字符串

  • json.dumps用于将 Python 对象 编码成 JSON 字符串。
  • 需要导入包import json
  • 函数的第一个参数 obj 表示要把指定对象转成json字符串
  • 参数的第二个参数ensure_ascii=False表示不使用ascii编码,可以在控制台显示中文。
  • indent=True参数根据数据格式缩进显示,读起来更加清晰。

响应头添加Content-Type表示指定数据的编码格式,防止数据到浏览器乱码。

# 响应头信息
    # 这里使用列表套元组的方法存放信息,每个元组为一个信息
    response_header = [
      ('Server', 'PWS/1.1'), 
      # 设置数据的编码格式为 utf-8
      ('Content-Type', 'text/html;charset=utf-8')
    ]
# 个人中心数据接口
# 绑定请求资源路径
@route('/center_data.html')
def center_data():
    # 从数据库中查询数据
    # 创建与数据库的连接对象
    conn = pymysql.connect(
        host='localhost',
        port=3306,
        user='root',
        password='285013',
        database='stock_db',
        charset='utf8'
    )
    # 获取执行sql的游标对象
    cur = conn.cursor()
    # sql
    sql = '''select i.code, i.short, i.chg, 
             i.turnover, i.price, i.highs, f.note_info 
             from info as i inner join focus as f on i.id = f.info_id;'''
    # 执行sql
    cur.execute(sql)
    # 获取全部结果
    result = cur.fetchall()
    # print(result)
    # 将结果由元组转成列表(元组转成json字符串会报错),元组内的每个小元组转成字典
    # 遍历元组中的每个元素,每个元素(每个小元组)取出值放到字典中
    # 最后字典组成列表
    center_data_list = [
        {
            'code': row[0],
            'short': row[1],
            'chg': row[2],
            'turnover': row[3],
            # Decimal不能转json,会报错
            'price': str(row[4]),
            'highs': str(row[5]),
            'note_info': row[6],
        } for row in result
    ]
    # print(center_data_list)
    # 列表转成json字符串
    # ensure_ascii=False表示可以在控制台显示中文。
    # indent:参数根据数据格式缩进显示,读起来更加清晰。
    json_str = json.dumps(center_data_list, ensure_ascii=False, indent=True)
    # print(json_str)
    # 状态信息
    status = '200 OK'
    # 响应头信息
    # 这里使用列表套元组的方法存放信息,每个元组为一个信息
    response_header = [('Server', 'PWS/1.1'), ('Content-Type', 'text/html;charset=utf-8')]
    # 关闭对象
    cur.close()
    conn.close()
    # 向浏览器返回数据
    return status, response_header, json_str

8. logging日志

8.1 logging日志的介绍

在现实生活中,记录日志非常重要,比如:银行转账时会有转账记录;飞机飞行过程中,会有个黑盒子(飞行数据记录器)记录着飞机的飞行过程,那在python程序中想要记录程序在运行时所产生的日志信息,可以使用 logging 这个包来完成。

8.2 记录程序日志信息的目的是

  1. 可以很方便的了解程序的运行情况
  2. 可以分析用户的操作行为、喜好等信息
  3. 方便开发人员检查bug

8.3 logging日志级别介绍

日志等级可以分为5个,从低到高分别是:

  • DEBUG:程序调试bug时使用
  • INFO:程序正常运行时使用
  • WARNING:程序未按预期运行时使用,但并不是错误,如:用户登录密码错误
  • ERROR:程序出错误时使用,如:IO操作失败
  • CRITICAL:特别严重的问题,导致程序不能再继续运行时使用,如:磁盘空间为空,一般很少使用

默认的是WARNING等级,当在WARNING或WARNING之上等级的才记录日志信息。

日志等级从低到高的顺序是: DEBUG < INFO < WARNING < ERROR < CRITICAL

8.4 logging日志的使用

在 logging 包中记录日志的方式有两种:

  1. 输出到控制台
  2. 保存到日志文件

8.4.1 日志信息输出到控制台的示例代码

import logging
logging.debug('这是一个debug级别的日志信息')
logging.info('这是一个info级别的日志信息')
logging.warning('这是一个warning级别的日志信息')
logging.error('这是一个error级别的日志信息')
logging.critical('这是一个critical级别的日志信息')

由于默认的是WARNING等级,在WARNING或WARNING之上等级的才记录日志信息,所以WARNING以下的两个等级DEBUG、INFO都不显示。

8.4.2 logging日志等级和输出格式的设置

设置logging的配置信息,使用:

logging.basicConfig()
  • level 表示设置的日志等级
  • format 表示日志的输出格式, 参数说明:
  • %(levelname)s: 打印日志级别名称
  • %(filename)s: 打印当前执行程序名
  • %(lineno)d: 打印日志的当前行号,程序运行的行号
  • %(asctime)s: 打印日志的时间,获取当前时间
  • %(message)s: 打印日志信息

改变logging日志等级:

# 导入包
import logging
# 设置logging日志等级为DEBUG
logging.basicConfig(level=logging.DEBUG)
logging.debug('这是一个debug级别的日志信息')
logging.info('这是一个info级别的日志信息')
logging.warning('这是一个warning级别的日志信息')
logging.error('这是一个error级别的日志信息')
logging.critical('这是一个critical级别的日志信息')

设置logging的输出格式:

# 导入包
import logging
# level 表示设置的日志等级
# format 表示日志的输出格式
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
logging.debug('这是一个debug级别的日志信息')
logging.info('这是一个info级别的日志信息')
logging.warning('这是一个warning级别的日志信息')
logging.error('这是一个error级别的日志信息')
logging.critical('这是一个critical级别的日志信息')

8.4.3 日志信息保存到日志文件

日志信息保存到日志文件,使用:

logging.basicConfig()
  • filename=" ":日志信息保存的文件名
  • filemode=" ":文件的打开方式
  • encoding=‘utf-8’:设置编码格式
# 导入包
import logging
# level 表示设置的日志等级
# format 表示日志的输出格式
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s',
    filename='log.txt',
    filemode='a',
    encoding='utf-8'
)
logging.debug('这是一个debug级别的日志信息')
logging.info('这是一个info级别的日志信息')
logging.warning('这是一个warning级别的日志信息')
logging.error('这是一个error级别的日志信息')
logging.critical('这是一个critical级别的日志信息')

8.4.4 logging日志在mini-web项目中应用

logging日志配置信息在程序入口模块设置一次,整个程序都可以生效。

程序入口模块设置logging日志的设置

import socket
 import threading
 import sys
 import framework
 import logging
 # logging日志的配置
logging.basicConfig(
   level=logging.DEBUG,
     format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s',
   filename="log.txt",
   filemode="w",
     encoding='utf-8'
)

INFO级别的日志输出,示例代码

if request_path.endswith('.html'):
            logging.info('动态资源请求:'+ request_path)
            ...
        else:
            # 静态资源请求
            logging.info('静态资源请求:' + request_path)
            ...


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
9天前
|
数据库 Python
Python实践:从零开始构建你的第一个Web应用
使用Python和轻量级Web框架Flask,你可以轻松创建Web应用。先确保安装了Python,然后通过`pip install Flask`安装Flask。在`app.py`中编写基本的&quot;Hello, World!&quot;应用,定义路由`@app.route(&#39;/&#39;)`并运行`python app.py`启动服务器。扩展应用,可添加新路由显示当前时间,展示Flask处理动态内容的能力。开始你的Web开发之旅吧!【6月更文挑战第13天】
34 2
|
6天前
|
关系型数据库 MySQL 数据库
如何使用Python的Flask框架来构建一个简单的Web应用
如何使用Python的Flask框架来构建一个简单的Web应用
12 0
|
2天前
|
JSON API 数据库
Python使用Quart作为web服务器的代码实现
Quart 是一个异步的 Web 框架,它使用 ASGI 接口(Asynchronous Server Gateway Interface)而不是传统的 WSGI(Web Server Gateway Interface)。这使得 Quart 特别适合用于构建需要处理大量并发连接的高性能 Web 应用程序。与 Flask 类似,Quart 也非常灵活,可以轻松地构建 RESTful API、WebSockets、HTTP/2 服务器推送等。
|
3天前
|
缓存 前端开发 API
了解python中几个主流的网络框架
【6月更文挑战第21天】探索Python Web几个流行框架,了解各框架特性以适应不同场景需求。
23 1
|
7天前
|
存储 数据挖掘 索引
Python streamlit框架开发数据分析网站并免费部署
使用Python的Streamlit框架,开发了一个在线数据分析工具,替代Excel查看设备温度CSV数据。通过pandas读取数据,matplotlib绘制图表。程序处理CSV,提取所需列,计算最大最小平均值,用户可多选查看特定数据。[GitHub](https://github.com/yigedaigua/MGHB)上有完整代码,应用已部署至Streamlit Cloud。
|
7天前
|
XML 前端开发 数据挖掘
Web数据提取:Python中BeautifulSoup与htmltab的结合使用
Web数据提取:Python中BeautifulSoup与htmltab的结合使用
|
6天前
|
前端开发 JavaScript 安全
Web前端开发中的三大主流框架
Web前端开发中的三大主流框架
|
10天前
|
机器人 测试技术 持续交付
Python进行自动化测试测试框架的选择与应用
【6月更文挑战第9天】本文介绍了Python自动化测试的重要性及选择测试框架的考量因素,如功能丰富性、易用性、灵活性和集成性。文中列举了常用的Python测试框架,包括unittest、pytest、nose2和Robot Framework,并提供了使用pytest进行单元测试的示例代码。此外,还展示了如何使用Robot Framework进行验收测试和Web UI测试。选择合适的测试框架对提升测试效率和软件质量至关重要,团队应根据项目需求、社区支持、集成性和学习曲线等因素进行选择。通过不断学习和实践,可以优化自动化测试流程,确保软件的稳定性和可靠性。
21 0
|
11天前
|
XML 数据格式 Python
Python基础教程(第3版)中文版 第15章 python和web(笔记)
Python基础教程(第3版)中文版 第15章 python和web(笔记)
|
1天前
|
机器学习/深度学习 人工智能 前端开发
Python中的模块化编程
【6月更文挑战第17天】Python模块化编程与软件架构设计的关键在于拆分任务到独立模块,提高代码的可维护性、可重用性和可扩展性。例如,学生管理系统可分解为录入、查询和删除模块。MVC和MVVM架构模式有助于组织代码,而微服务和函数式编程将在未来发展中扮演重要角色。通过示例代码,读者能学习如何实现这些概念,提升项目开发效率和质量。
147 57