[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日志并进行多维度分析。
相关文章
|
4天前
|
开发框架 数据库 开发者
Web开发新境界:用Python玩转Django和Flask!
【6月更文挑战第12天】Python的Web开发框架Django和Flask各有千秋。Django是全能型框架,适合快速开发大型应用,提供ORM、模板引擎、URL路由和后台管理等全面功能。Flask则轻量级且灵活,适用于小型到中型应用,以其简单易用、高度可扩展和灵活路由著称。两者结合使用,能应对各种Web开发需求。
|
1天前
|
数据库 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天】
12 2
|
2天前
|
机器人 测试技术 持续交付
Python进行自动化测试测试框架的选择与应用
【6月更文挑战第9天】本文介绍了Python自动化测试的重要性及选择测试框架的考量因素,如功能丰富性、易用性、灵活性和集成性。文中列举了常用的Python测试框架,包括unittest、pytest、nose2和Robot Framework,并提供了使用pytest进行单元测试的示例代码。此外,还展示了如何使用Robot Framework进行验收测试和Web UI测试。选择合适的测试框架对提升测试效率和软件质量至关重要,团队应根据项目需求、社区支持、集成性和学习曲线等因素进行选择。通过不断学习和实践,可以优化自动化测试流程,确保软件的稳定性和可靠性。
7 0
|
3天前
|
XML 数据格式 Python
Python基础教程(第3版)中文版 第15章 python和web(笔记)
Python基础教程(第3版)中文版 第15章 python和web(笔记)
|
3天前
|
前端开发 JavaScript 测试技术
web前端语言框架:探索现代前端开发的核心架构
web前端语言框架:探索现代前端开发的核心架构
15 4
|
4天前
|
分布式计算 负载均衡 并行计算
Python 分布式计算框架 PP (Parallel Python):集群模式下的实践探索
该文介绍了使用Parallel Python (PP) 在两台物理机上构建分布式计算集群的经验。PP是一个轻量级框架,旨在简化Python代码在多处理器系统和集群中的并行执行。文中通过设置子节点的IP、端口和密钥启动PP服务器,并在主节点创建PP实例进行负载均衡。实验使用官方的质数和计算示例,显示PP在集群模式下能有效利用多台机器的多核CPU,实现计算效率的显著提升。未来,作者计划进一步研究PP在更复杂任务和大规模集群中的应用潜力。
|
5天前
|
运维 Serverless API
Serverless 应用引擎产品使用合集之如何实现一键迁移Web框架
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
6天前
|
数据采集 存储 中间件
Scrapy,作为一款强大的Python网络爬虫框架,凭借其高效、灵活、易扩展的特性,深受开发者的喜爱
【6月更文挑战第10天】Scrapy是Python的高效爬虫框架,以其异步处理、多线程及中间件机制提升爬取效率。它提供丰富组件和API,支持灵活的数据抓取、清洗、存储,可扩展到各种数据库。通过自定义组件,Scrapy能适应动态网页和应对反爬策略,同时与数据分析库集成进行复杂分析。但需注意遵守法律法规和道德规范,以合法合规的方式进行爬虫开发。随着技术发展,Scrapy在数据收集领域将持续发挥关键作用。
32 4
|
6天前
|
IDE 测试技术 持续交付
Python作为一种简洁、易读且功能强大的编程语言,其自动化测试和单元测试框架的丰富性和易用性为开发者提供了极大的便利
【6月更文挑战第10天】本文探讨了Python自动化测试与单元测试框架在提升代码质量和效率中的作用。Selenium、Appium和pytest是常用的自动化测试框架,分别支持Web和移动应用的测试。unittest是Python的标准单元测试框架,提供断言方法和测试组织结构。通过制定测试计划、编写高质量测试用例、持续集成与测试、以及有效利用测试报告,开发者能提高代码质量和开发效率。
23 1
|
10天前
|
前端开发 Python