7. 个人中心数据接口的开发
个人中心数据接口的开发,需要根据sql语句查询个人中心数据,然后将个人中心数据转成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 记录程序日志信息的目的是
- 可以很方便的了解程序的运行情况
- 可以分析用户的操作行为、喜好等信息
- 方便开发人员检查bug
8.3 logging日志级别介绍
日志等级可以分为5个,从低到高分别是:
- DEBUG:程序调试bug时使用
- INFO:程序正常运行时使用
- WARNING:程序未按预期运行时使用,但并不是错误,如:用户登录密码错误
- ERROR:程序出错误时使用,如:IO操作失败
- CRITICAL:特别严重的问题,导致程序不能再继续运行时使用,如:磁盘空间为空,一般很少使用
默认的是WARNING等级,当在WARNING或WARNING之上等级的才记录日志信息。
日志等级从低到高的顺序是: DEBUG < INFO < WARNING < ERROR < CRITICAL
8.4 logging日志的使用
在 logging 包中记录日志的方式有两种:
- 输出到控制台
- 保存到日志文件
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) ...