当前位置: 首页 > news >正文

python第七课

WSGI

Middleware

中间件,可以理解称对应用程序的一组装饰器,对两边都起作用的元素。

  • 重写environ,然后基于URL,将请求对象路由给不同的应用对象
  • 支持多个应用或者框架顺序地运行于同一个进程中
  • 通过转发请求和相应,支持负载均衡和远程处理
  • 支持对内容做后处理

应用程序看来,它可以提供一个类start_response函数,可以像start_response函数一样接收HTTP STATU和Headers和environ。

服务端看来,它可以接收2个参数,并且可以返回一个类Application对象。

练习:实现记录每次请求消耗时间功能的中间件

import time # time模块,获取当前时间,以便计算请求的处理时间
# 来自wsgiref.simple_server模块的make_server函数,用于创建一个简单的WSGI服务器
from wsgiref.simple_server import make_serverHELLO_WORLD = b'Hello, World!\n'# doucment.charset 网页摁F12在控制台输出该指令查询编码格式class ResponseTimingMiddleware(object): # 中间件类def __init__(self, app):
        self.app = appdef __call__(self, env, start_response): # __call__方法使得类的实例可以像函数一样被调用
        start_time = time.time()
        response = self.app(env, start_response)
        end_time = time.time()
        res_time = (end_time - start_time) * 1000 # 将秒转换为毫秒# 保留十位小数
        timing_text = "记录请求耗时中间件输出\n\n本次请求耗时:{:.10f}ms \n\n".format(res_time)
        # 将生成的时间记录信息转换为字节类型(使用encode()方法),并将其添加到相应内容response中
        response.append(timing_text.encode())return responsedef simple_app(environ, start_response):
    # 状态码
    status = '200 OK'
    # 设置Content-type响应头,明确字符编码为 utf-8(解决中文乱码问题) 
    response_header = [('Content-type', 'text/plain; charset=utf-8')] # 格式固定    return_body = []# environ 是一个包含了所有HTTP请求信息的字典for k, v in environ.items():
        return_body.append("{}: {}".format(k, v))    start_response(status, response_header)return ["\n".join(return_body).encode()]# 创建应用程序
app = ResponseTimingMiddleware(simple_app)server=make_server('127.0.0.1',8080,app=app)  # 127.0.0.1  app(env, start_response)
server.serve_forever()

  • 中间件类 ResponseTimingMiddleware:
  • __init__ 方法:初始化中间件类,接收一个 WSGI 应用程序 app 作为参数,并将其存储在实例属性 self.app 中。
  • __call__ 方法:使得类的实例可以像函数一样被调用。
  • 该方法在每次处理请求时被调用,具体步骤如下:
    • start_time = time.time()记录请求开始的时间。
    • response = self.app(env, start_response)调用原始的 WSGI 应用程序处理请求,并获取响应内容。
    • end_time = time.time()记录请求结束的时间。
    • res_time = (end_time - start_time) * 1000计算请求的处理时间,并将其转换为毫秒。
    • timing_text生成包含请求处理时间的文本信息,保留十位小数。
    • response.append(timing_text.encode())将时间记录信息转换为字节类型,并添加到响应内容中。
    • return response返回包含时间记录信息的响应内容。
  • WSGI 应用程序 simple_app:

  • environ是一个包含了所有 HTTP 请求信息字典,如请求方法、请求 URL、请求头信息等。
  • start_response是一个回调函数,用于设置响应的状态码和响应头
  • status设置响应的状态码为“ 200 OK”,表示请求成功。
  • response_header设置响应头,指定响应内容的类型为纯文本,并使用 UTF-8 编码,以解决中文乱码问题。
  • return_body遍历 environ 字典,将每个键值对转换为字符串,并添加到 return_body 列表中。
  • start_response(status, response_header)调用 start_response 回调函数,设置响应的状态码和响应头。
  • return ["\n".join(return_body).encode()]将 return_body 列表中的字符串用换行符连接起来,转换为字节类型,并作为响应内容返回。
  • 创建应用程序并启动服务器:
  • app = ResponseTimingMiddleware(simple_app)将 simple_app 应用程序包装在 ResponseTimingMiddleware 中间件中,创建一个新的应用程序
  • make_server('127.0.0.1', 8080, app=app)创建一个简单的 WSGI 服务器,监听本地地址 127.0.0.1 的 8080 端口,并使用 app 作为处理请求的应用程序
  • server.serve_forever()启动服务器,并使其一直运行,不断处理接收到的请求。

运行这段 Python 代码后,会启动一个简单的 WSGI(Web Server Gateway Interface)服务器,该服务器监听本地的 8080 端口,处理客户端的 HTTP 请求,并在响应中添加请求处理时间的记录信息

Webpy

web.py是一款轻量级的python web开发框架,简单、高效、学习成本低,特别适合作为python web开发的入门框架

app.py

import web
#每个web.py应用必须先导入import web模块#URL处理
#告诉webpy怎么组织URL
#第一部分是匹配URL的正则表达式
#第二部分是接受请求的类名称
#
urls 是一个元组,用于定义 Web 应用的路由规则。路由规则决定了不同的 URL 请求将由哪个类或函数来处理'/(.*)':这是一个正则表达式/表示根路径(.*)表示捕获根路径之后任意字符序列(包括空字符)。该正则表达式的作用匹配所有的 URL 请求'Hello':表示当匹配到上述正则表达式的 URL 请求时,将由名为 Hello的类处理该请求urls = (    '/(.*)', 'hello'
)#创建一个列举这些URL的application
# globals():这是 Python 的内置函数,返回当前全局符号表的字典。
web.py会使用这个字典来查找路由规则中指定的处理类(如 Hello 类)app = web.application(urls, globals())class hello:        # 在 web.py中,GET方法用于处理 HTTP GET 请求
    def GET(self, name): # name是从 URL 中捕获的参数(由正则表达式 (.*)捕获)if not name: 
            name = 'World'return 'Hello, ' + name + '!'application = app.wsgifunc()
#
app.wsgifunc():这是 web.py提供的一个方法,用于将 web.py应用实例转换为符合 WSGI 协议的可调用对象application:将转换后的 WSGI 可调用对象赋值给 application 变量。这样做的目的是为了让应用可以在支持 WSGI 的服务器(如 Gunicorn、uWSGI 等)上部署和运行。# 让web.py启动网页应用if __name__ == "__main__":
    app.run() 
#
调用 web.py应用实例的 run()方法,启动一个内置的简单 Web 服务器,监听默认端口(通常是 8080),开始处理客户端的 HTTP 请求


 

相关文章:

python第七课

WSGI Middleware 中间件,可以理解称对应用程序的一组装饰器,对两边都起作用的元素。 重写environ,然后基于URL,将请求对象路由给不同的应用对象支持多个应用或者框架顺序地运行于同一个进程中通过转发请求和相应,支持负…...

华为IPD简介

创作灵感 现在“熟悉华为IPD”经常出现在高级招聘岗位能力要求上,于是作者写下此文章以此巩固相关知识储备 名词解释 华为IPD(Integrated Product Development,集成产品开发)是华为引入并优化的一套产品开发管理体系&#xff0…...

如何在Spring Boot中配置分布式配置中心

文章目录 如何在Spring Boot中配置分布式配置中心分布式配置中心的概念1. 集中管理2. 动态配置3. 环境隔离4. 安全性5. 可扩展性与适应性6. 与 CI/CD 流程的集成Spring Cloud Config 概述1. 集中式配置管理2. 多环境支持3. 版本控制4. 动态刷新5. 安全性6. 与微服务架构的无缝集…...

Golang internals

To be continued... time.Time golang的时区和神奇的time.Parse context.Context Go Context的踩坑经历 sync.Pool sync.Pool workflow in Go 1.12 new shared pools in Go 1.13 什么是cpu cache理解 Go 1.13 中 sync.Pool 的设计与实现Go: Understand the Design of Sync.Pool…...

天翼云910B部署DeepSeek蒸馏70B LLaMA模型实践总结

一、项目背景与目标 本文记录在天翼云昇腾910B服务器上部署DeepSeek 70B模型的全过程。该模型是基于LLaMA架构的知识蒸馏版本,模型大小约132GB。 1.1 硬件环境 - 服务器配置:天翼云910B服务器 - NPU:8昇腾910B (每卡64GB显存) - 系统内存&…...

数据治理常用的开源项目有哪些?

数据治理是企业在大数据时代中确保数据质量、安全性和可用性的关键环节。开源项目在数据治理中扮演着重要角色,提供了灵活、经济高效且功能强大的解决方案。以下是一些常用的开源数据治理项目: Apache Atlas: 功能:元数据管理、数…...

数据结构与算法之排序算法-(计数,桶,基数排序)

排序算法是数据结构与算法中最基本的算法之一,其作用就是将一些可以比较大小的数据进行有规律的排序,而想要实现这种排序就拥有很多种方法~ 📚 非线性时间比较类: 那么我将通过几篇文章,将排序算法中各种算法细化的&a…...

Word正文中每两个字符之间插入一个英文半角空格

Word正文中每两个字符之间插入一个英文半角空格 修改前 修改后 替换方法 快捷键 Ctrl H 唤出查找和替换界面依次输入上述内容全部替换即可 参考链接 【【2025年3月】计算机二级MS Office 2016 真题讲解视频打卡】 【精准空降到 25:27】...

把 DeepSeek1.5b 部署在显卡小于4G的电脑上

这里写自定义目录标题 介绍准备安装 Ollama查看CUDA需要版本安装CudaToolkit检查Cuda是否装好设置Ollama环境变量验证是否跑在GPU上ollama如何导入本地下载的模型安装及配置docker安装open-webui启动open-webui开始对话 调整gpu精度 介绍 Deepseek1.5b能够运行在只用cpu和gpu内…...

A4988一款带转换器和过流保护的 DMOS 微步驱动器的使用方式

A4988是一款带转换器和过流保护的 DMOS 微步驱动器,用于驱动双极步进电动机。它支持全、半、1/4、1/8 及 1/16 步进模式,输出驱动性能可达 35 V 及 2 A。其特点包括简单的步进和方向控制接口、可调电位器调节最大电流输出、自动电流衰减模式检测/选择以及…...

一口井深7米,一只蜗牛从井底往上爬每天爬3米掉下去1米,问几天能爬上井口?

一个井深7米,一只蜗牛从井底往上爬每天爬3米掉下去1米,问几天能爬上井口? 1. 通用解法 构建一个通用的解法,适用于任何井深和蜗牛的爬升、下滑距离。 问题描述: 井深为 H H H 米。蜗牛每天向上爬升 U U U 米。每…...

Asp.Net Core MVC 中级开发教程

Asp.Net Core MVC 中级开发教程 一、Asp.Net Core Mvc 区域使用 ASP.NET Core MVC的Areas使用整理 - 天马3798 - 博客园 二、Asp.Net Core 路径处理 Asp.Net Core Web相对路径、绝对路径整理 Asp.Net Core获取当前上下文对象 三、Asp.Net Core 服务使用和封装 四、Asp.Net …...

Windows上安装Go并配置环境变量(图文步骤)

前言 1. 本文主要讲解的是在windows上安装Go语言的环境和配置环境变量; Go语言版本:1.23.2 Windows版本:win11(win10通用) 下载Go环境 下载go环境:Go下载官网链接(https://golang.google.cn/dl/) 等待…...

C++效率掌握之STL库:string底层剖析

文章目录 1.学习string底层的必要性2.string类对象基本函数实现3.string类对象的遍历4.string类对象的扩容追加5.string类对象的插入、删除6.string类对象的查找、提取、大小调整7.string类对象的流输出、流提取希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力…...

【Erdas实验教程】004:影像镶嵌拼接

文章目录 一、实验目标二、实验数据三、实验过程一、实验目标 掌握具有坐标系且有重叠的多个影像的镶嵌。 二、实验数据 本实验数据为2景landsat TM影像和1景mss影像,如下所示: 数据获取方式:订阅专栏后,从私信查收。 三、实验过程 (1)启动镶嵌工具 在erdas中,常用…...

SpringMVC 请求参数接收

目录 请求 传递单个参数 基本类型参数传递 未传递参数 ?传递参数类型不匹配 传递多个参数 传递对象 后端参数重命名 传递数组 传递集合 传递JSON数据 JSON是什么 JSON的优点 传递JSON对象 获取URL中的参数 文件上传 在浏览器与程序进行交互时,主要…...

[高等数学]换元积分法

一、知识点 (一) 第一类换元法 定理1 设 f ( u ) f(u) f(u) 具有原函数, u φ ( x ) u\varphi(x) uφ(x) 可导,则有换元公式: ∫ f [ φ ( x ) ] φ ′ ( x ) d x [ ∫ f ( u ) d u ] u φ ( x ) . \int f[\varphi(x)]\varphi (x)dx[\int f(u)du]…...

Redis简介、常用命令及优化

文章目录 一、关系数据库??与非关系型数据库概述 1. 关系型数据库2. 非关系型数据库3.关系数据库与非关系型数据库区别 二、Redis简介 1.Redis的单线程模式2.Redis 优点3.Redis 缺点 三、安装redis四、Redis 命令工具五、Redis 数据库常用命令六、Redis 多数据库常用命令七、…...

大模型训练为什么依赖GPU

近年来,随着人工智能技术的飞速发展,特别是深度学习领域的进步,大模型的训练逐渐成为研究和工业界的热点。作为大模型训练中的核心硬件,GPU(图形处理单元)扮演了至关重要的角色。那么,为什么大模…...

帕金森病与三叉神经痛的基因关联分析

帕金森病(Parkinsons Disease, PD)和三叉神经痛(Trigeminal Neuralgia, TN)是两种不同的神经系统疾病,前者主要影响运动功能,而后者则表现为剧烈的面部疼痛。尽管这两种疾病在临床表现上有显著差异&#xf…...

腾讯会议企业管理员 REST API 实战:用户/部门批量管理与会议合规审计

本文适用于企业级管理员开发场景,代码基于腾讯会议 REST API v2,Python 3.x 示例。 参考文档:腾讯会议开放平台 API 文档 【内文配图1位置】 背景 中大型企业使用腾讯会议企业版后,IT 管理员通常面临以下管理需求: 批…...

视频人脸打码软件工具

引言随着视频录制、直播互动、公共终端应用的普及,人脸信息作为核心个人隐私,其保护需求日益迫切。无论是课堂录制中需要隐藏学生身份、直播场景下保护观众隐私,还是自助终端界面避免路人面部泄露,传统手动打码效率低下、易遗漏的…...

NIQ研究揭示商业新规则:人工智能正开始决定消费者购买什么

NIQ最新的全球报告《商业革命:东西方交汇》探讨了商业智能如何帮助品牌、零售商和平台在快速融合的全球格局中把握方向 人工智能正迅速从一种工具转变为“买家”,从而重塑人们发现、选择和购买产品的方式 零售业的下一波增长浪潮并非源自传统电子商务&am…...

ARMv6 SIMD指令集优化嵌入式开发实战

1. ARMv6 SIMD指令集概述在嵌入式开发领域,性能优化始终是开发者面临的核心挑战之一。ARMv6架构引入的SIMD(Single Instruction Multiple Data)指令集为这一挑战提供了优雅的解决方案。SIMD技术允许单条指令同时处理多个数据元素,…...

G-Helper:华硕笔记本的轻量级性能管家,告别Armoury Crate的臃肿体验

G-Helper:华硕笔记本的轻量级性能管家,告别Armoury Crate的臃肿体验 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProAr…...

【优化求解】基于Sarsa强化学习的异构网络切换算法matlab仿真

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。 🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 &…...

别再混淆了!5分钟搞懂Linux里的TTY、PTS和PTY到底啥关系(附常用命令清单)

别再混淆了!5分钟搞懂Linux里的TTY、PTS和PTY到底啥关系(附常用命令清单) 第一次在Linux终端里敲who命令时,看到输出结果里的pts/0和tty1是不是一头雾水?更别提/dev/ptmx这种神秘路径了。别担心,今天我们就…...

嵌入式安全关键系统开发:形式化需求验证工具STIMULUS的核心价值与实践

1. 项目概述:为什么我们需要更好的软件需求工具?在嵌入式系统开发领域,尤其是涉及安全关键(Safety-Critical)应用的场景,如汽车电子、医疗设备或工业控制,项目成败往往在写下第一行代码之前就已…...

企业级应用架构演进:DDD分层与领域事件解耦实战

1. 项目概述:从“ARC-402”看企业级应用架构的演进 最近在梳理一个老项目的技术债,项目代号“ARC-402”,或者更常见的叫法是 arc402 。这名字听起来有点神秘,像是某个内部系统的版本号,或者是一个特定架构方案的代号…...

基于本地AI与向量数据库的智能书签管理系统实战

1. 项目概述:当书签管理遇上AI智能如果你和我一样,是个重度网络冲浪者,或者从事需要大量信息检索的工作,浏览器收藏夹(书签)大概率已经成了一个“数字黑洞”。我敢打赌,你的书签栏里塞满了各种链…...