flask中的werkzeug介绍

在这里插入图片描述

flask中的werkzeug

Werkzeug是一个Python库,用于开发Web应用程序。它是一个WSGI(Web Server Gateway Interface)工具包,提供了一系列实用功能来帮助开发者处理HTTP请求、响应、URLs等等。Werkzeug的设计非常灵活,可以用作构建各种Web框架的基础。

Werkzeug的特性包括:

  • 请求和响应对象:Werkzeug为HTTP请求和响应提供了易于使用的包装器,使得开发者可以更方便地处理这些请求和响应。
  • URL路由:Werkzeug提供了强大的URL路由功能,能够帮助开发者将URL映射到相应的处理函数。(文末进行举例说明)
  • 错误处理:Werkzeug提供了异常处理机制,可以方便地处理HTTP错误,并且提供了一个交互式的调试器,使得在开发过程中调试错误更加方便。
  • HTTP工具:Werkzeug还提供了一些其他的HTTP相关的工具,比如处理cookies、文件上传等。

例子

from werkzeug.wrappers import Request, Responsedef application(environ, start_response):request = Request(environ)text = 'Hello, %s!' % request.args.get('name', 'World')response = Response(text, mimetype='text/plain')return response(environ, start_response)if __name__ == '__main__':from werkzeug.serving import run_simplerun_simple('localhost', 4000, application)
def application(environ, start_response):

这定义了一个函数,名为application。这个函数符合WSGI的规范,是一个典型的WSGI应用。它接受两个参数,environ是一个包含所有HTTP请求信息的字典,start_response是一个发送HTTP响应的回调函数。

  request = Request(environ)

这行代码用Werkzeug的Request类将environ字典包装为一个Request对象,这样我们就可以方便地通过面向对象的方式访问HTTP请求的信息。

 text = 'Hello, %s!' % request.args.get('name', 'World')

这行代码从request.args(一个MultiDict,包含所有的查询参数)中获取’name’参数的值,如果没有找到’name’参数,那么就默认为’World’。然后使用这个值生成一段问候语。

 response = Response(text, mimetype='text/plain')

这行代码创建一个Response对象,它接受两个参数,第一个参数是HTTP响应的主体(在这个例子中是一段问候语),第二个参数是响应的MIME类型,这里设置为’text/plain’,表示响应的内容是纯文本。

return response(environ, start_response)

最后,这行代码调用response对象的__call__方法,传入environstart_response。这样Response对象就会按照WSGI的规范,调用start_response发送HTTP响应。因为Response类是可调用的,所以我们可以将其作为WSGI应用返回。

要发送带有 ‘name’ 参数的请求,你只需要在URL中添加一个查询参数即可。例如,如果你的服务器运行在localhost的4000端口上,你可以通过以下URL发送请求:

http://localhost:4000/?name=YourName

在这个URL中,‘?’ 后面的部分是查询参数。你可以通过更改 ‘YourName’ 来改变 ‘name’ 参数的值。例如,如果你将 ‘YourName’ 改为 ‘Alice’,那么服务器将会响应 ‘Hello, Alice!’。

werkzeug的路由系统

在 Werkzeug 中,路由的处理主要通过 werkzeug.routing 模块中的 MapRule 类来实现。下面是一个简单的示例:

from werkzeug.routing import Map, Rule
from werkzeug.wrappers import Request, Response# 创建一个 URL 映射
url_map = Map([Rule('/', endpoint='hello'),  # 将根路径 / 映射到 'hello' 端点Rule('/bye', endpoint='bye')  # 将 /bye 路径映射到 'bye' 端点
])# 创建处理函数字典
view_functions = {'hello': lambda: Response('Hello, World!'),'bye': lambda: Response('Goodbye, World!')
}# 创建 WSGI 应用
def application(environ, start_response):request = Request(environ)urls = url_map.bind_to_environ(request.environ)  # 将环境绑定到 URL 映射endpoint, args = urls.match()  # 从 URL 映射中匹配请求路径response = view_functions[endpoint]()  # 使用相应的处理函数处理请求return response(environ, start_response)# 在主程序中运行 WSGI 服务器
if __name__ == '__main__':from werkzeug.serving import run_simplerun_simple('localhost', 4000, application)

在这个例子中,我们首先创建了一个 Map 对象,它包含了两个 Rule。每个 Rule 都定义了一个 URL 模式和一个对应的端点。然后,我们创建了一个字典 view_functions,它将每个端点映射到一个处理函数。

然后,我们创建了一个 WSGI 应用 application。这个应用首先使用 Map.bind_to_environ 方法将请求环境绑定到 URL 映射,然后使用 MapAdapter.match 方法从 URL 映射中匹配请求路径,最后使用相应的处理函数处理请求。

最后,我们在主程序中使用 run_simple 函数运行一个 WSGI 服务器,将 application 作为处理函数。这样,当你访问 http://localhost:4000/ 时,你将看到 ‘Hello, World!’,当你访问 http://localhost:4000/bye 时,你将看到 ‘Goodbye, World!’。

重点

urls = url_map.bind_to_environ(request.environ) 

这行代码的作用是创建一个 MapAdapter 对象。 MapAdapter 对象是 Werkzeug 路由系统的关键组成部分,它的主要任务是根据当前的请求环境,匹配最合适的 URL 规则。

这里的 request.environ 是一个字典,包含了所有的 WSGI 环境变量,例如 HTTP 方法、路径、查询参数等。当我们调用 url_map.bind_to_environ(request.environ) 时,Werkzeug 实际上是在创建一个能够理解当前请求环境的 MapAdapter 对象。

然后,你就可以在这个 MapAdapter 对象上调用 match() 方法,来匹配当前请求的 URL。如果找到了匹配的规则,match() 方法会返回一个包含端点名称和路径参数的元组。

假设我们访问 “http://localhost:4000/bye” 这个 URL,那么在 application 函数中:

  1. request = Request(environ):这行代码将请求环境包装成一个 Request 对象,方便我们访问请求相关的信息。
  2. urls = url_map.bind_to_environ(request.environ):这行代码将当前的请求环境(包括 HTTP 方法、路径 ‘/bye’ 等)绑定到 url_map 上,并返回一个 MapAdapter 对象 urlsurls 了解如何将请求环境与 url_map 中定义的 URL 规则进行匹配。
  3. endpoint, args = urls.match():这行代码在 urls 中查找匹配当前请求环境的 URL 规则。在这个例子中,它找到了规则 Rule('/bye', endpoint='bye'),并返回其对应的端点 'bye'
  4. response = view_functions[endpoint]():这行代码查找与端点 'bye' 对应的处理函数(即 view_functions['bye']),并调用这个函数处理请求。在这个例子中,处理函数返回了一个 Response 对象,其内容为 'Goodbye, World!'
  5. return response(environ, start_response):这行代码将响应返回给客户端。

所以,url_map.bind_to_environ(request.environ) 的作用就是创建一个 MapAdapter 对象,这个对象能够根据当前的请求环境,在 url_map 中找到匹配的 URL 规则。

MapAdapter类介绍

MapAdapter是Werkzeug路由系统中的一个重要类,用于处理URL规则与具体请求之间的匹配与生成URL。以下是MapAdapter中的一些重要的方法和属性:

  • match(path_info=None, method=None): 尝试匹配给定的路径和方法(如果提供)与 Map 中的 Rule 规则。如果找到匹配的规则,这个方法会返回一个元组,包含端点名称和路径参数。如果没有找到匹配的规则,这个方法会抛出 NotFound 异常。如果找到了多个匹配的规则,这个方法会抛出 MethodNotAllowed 异常。
  • build(endpoint, values=None, method=None, force_external=False, append_unknown=True): 生成一个URL,该URL与指定的端点和值匹配。这个方法在你需要生成应用内的URL时非常有用,例如在重定向或链接生成时。
  • bind_to_environ(environ, server_name=None): 生成一个新的 MapAdapter,该 MapAdapter 是当前 MapAdapter 的副本,但绑定到给定的WSGI环境。这在处理请求时非常有用,因为它可以创建一个理解当前请求的 MapAdapter
  • bind(server_name, script_name=None, subdomain=None, url_scheme='http', default_method='GET'): 生成一个新的 MapAdapter,该 MapAdapter 是当前 MapAdapter 的副本,但绑定到指定的服务器名称、脚本名称、子域名和URL方案。这在你需要在不同环境中测试路由系统时非常有用。

此外,MapAdapter还包含一些用于配置路由系统的属性,例如 map(与 MapAdapter 关联的 Map 对象)、server_name(服务器的名称)和 url_scheme(URL的方案,通常是 ‘http’ 或 ‘https’)。

MapAdapter 本身并不存储任何请求或响应信息。它的主要任务是理解如何将请求匹配到 Map 中的 Rule 规则,并根据这些规则生成URL。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/7917.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

请问学JavaScript 前要学html 和css 吗?

前言 html和css可以理解为是一个网站的骨架和皮肤,这两部分做好后整个网站的外观展示的完成度基本就有了个90%左右,所以在学习js前是需要学习html和css 的,这两部分不用花特别多的时间(虽然css如果想做一些非常炫酷的效果个人认为…

vue中重新获取数据导致页面加长,要求在页面更新之后浏览器滚动条滚动到之前浏览记录的位置。以及获取当前页面中是哪个元素产生滚动条的方法。

目前的页面样式为&#xff1a; 代码是&#xff1a; <section id"detailSection"><el-tableref"multipleTable":data"logDetailList"style"width: 650px;margin:20px auto;"id"dialogDetail":show-header"fals…

App测试流程及测试点

1 APP测试基本流程 1.1流程图 1.2测试周期 测试周期可按项目的开发周期来确定测试时间&#xff0c;一般测试时间为两三周&#xff08;即15个工作日&#xff09;&#xff0c;根据项目情况以及版本质量可适当缩短或延长测试时间。正式测试前先向主管确认项目排期。 1.3测试资源…

启动es容器错误

说明&#xff1a;启动es容器&#xff0c;刚启动就停止&#xff0c;查看日志&#xff0c;出现以下错误信息&#xff08;java.lang.IllegalArgumentException: Plugin [analysis-ik] was built for Elasticsearch version 8.8.2 but version 7.12.1 is running&#xff09; 解决&…

【2023】HashMap详细源码分析解读

前言 在弄清楚HashMap之前先介绍一下使用到的数据结构&#xff0c;在jdk1.8之后HashMap中为了优化效率加入了红黑树这种数据结构。 树 在计算机科学中&#xff0c;树&#xff08;英语&#xff1a;tree&#xff09;是一种抽象数据类型&#xff08;ADT&#xff09;或是实作这种…

【洛谷】P4414 [COCI2006-2007#2] ABC

[COCI2006-2007#2] ABC 题面翻译 【题目描述】 三个整数分别为 A , B , C A,B,C A,B,C。这三个数字不会按照这样的顺序给你&#xff0c;但它们始终满足条件&#xff1a; A < B < C A < B < C A<B<C。为了看起来更加简洁明了&#xff0c;我们希望你可以按…

MySQL学习笔记 ------ 分组查询

#进阶5&#xff1a;分组查询 /* 语法&#xff1a; select 分组函数&#xff0c;列&#xff08;要求出现在group by的后面&#xff09; from 表 【where 筛选条件】 group by 分组的列表 【order by 排序的字段】; 注意&#xff1a;查询列表必须特殊&#xff0c;要求是分组函…

ChatGPT在智能电子设备中的应用如何?

ChatGPT在智能电子设备中有着广泛的应用潜力&#xff0c;可以为电子设备提供更智能、更个性化的用户体验&#xff0c;并为用户提供更多便利和高效的功能和服务。智能电子设备是指通过集成计算机、传感器、网络和人工智能等技术&#xff0c;实现智能化的功能和交互的设备。ChatG…

【C#】Lock关键字

一、概述 Lock关键字&#xff0c;确保当一个线程位于代码的临界区时&#xff0c;另一个线程不进入临界区。如果其他线程试图进入锁定的代码&#xff0c;则它将一直等待&#xff08;即被阻止&#xff09;&#xff0c;直到该对象被释放。 Lock关键字属于语法糖&#xff0c;其本…

数据结构【栈和队列】

第三章 栈与队列 一、栈 1.定义&#xff1a;只允许一端进行插入和删除的线性表&#xff0c;结构与手枪的弹夹差不多&#xff0c;可以作为实现递归函数&#xff08;调用和返回都是后进先出&#xff09;调用的一种数据结构&#xff1b; 栈顶&#xff1a;允许插入删除的那端&…

网络知识点之-BGP协议

边界网关协议&#xff08;BGP&#xff09;是运行于 TCP 上的一种自治系统的路由协议。 BGP 是唯一一个用来处理像因特网大小的网络的协议&#xff0c;也是唯一能够妥善处理好不相关路由域间的多路连接的协议。 BGP 构建在 EGP 的经验之上。 BGP 系统的主要功能是和其他的 BGP 系…

How to Use your mac to Read a Word and Repeat it more times

Using the say Command on a Mac 在 Mac 上使用 say 命令 The say command is a fun and useful feature on Mac computers that allows you to convert text to speech using the command line. With this command, you can make your Mac speak anything you type after it…

特征选择策略:为检测乳腺癌生物标志物寻找新出口

内容一览&#xff1a;microRNA&#xff08;小分子核糖核酸&#xff09;是一类短小的单链非编码 RNA 转录体。这些分子在多种恶性肿瘤中呈现失控性生长&#xff0c;因此近年来被诸多研究确定为确诊癌症的可靠的生物标志物 (biomarker)。在多种病理分析中&#xff0c;差异表达分析…

vue3下的uniapp跨域踩坑

uniapp vue3 H5跨域踩坑 开发移动端H5的时候由于后端接口没有做跨域处理&#xff0c;因此需要做下服务器代理&#xff0c;于是百度搜索了uniapp下h5的跨域配置 在manifest下的h5配置proxy&#xff0c;大概是这样: "h5": {"devServer": {"https"…

安全—01day

文章目录 1. 编码1.1 ASCLL编码1.2 URL编码1.3 Unicode编码1.4 HTML编码1.5 Base64编码 2. form表单2.1 php接收form表单2.2 python接收form表单 1. 编码 1.1 ASCLL编码 ASCII 是基于拉丁字母的一套电脑编码系统&#xff0c;主要用于显示现代英语和其他西欧语言。它是最通用的…

对话天壤创始人薛贵荣:AIGC正在成为新的“水煤电”

AIGC正在悄无声息地成为各行各业的必需品。 数科星球原创 作者丨苑晶 编辑丨大兔 国内的大模型混战半年有余&#xff0c;传统互联网巨头和人工智能公司纷纷入场。在“百模大战”的关键时刻&#xff0c;行业悄然发生分化。一些更具前瞻性的企业开始眺望远方&#xff0c;准备打…

ajax/axios访问后端测试方法

文章目录 1、浏览器执行javascript方法GET请求POST请求 2、Postman测试工具GET请求POST请求 3、idea IDE提供的httpclient4、Apache JMeter 1、浏览器执行javascript方法 GET请求 http://localhost:6060/admin/get/123 POST请求 技巧&#xff1a;打开谷歌浏览器&#xff0c…

zookeeper学习(二) 集群模式安装

前置环境 三台centos7服务器 192.168.2.201 192.168.2.202 192.168.2.150三台服务器都需要安装jdk1.8以上zookeeper安装包 安装jdk 在单机模式已经描述过&#xff0c;这里略过&#xff0c;有需要可以去看单机模式中的这部分&#xff0c;注意的是三台服务器都需要安装 安装…

C数据结构与算法——队列 应用(C语言纯享版 迷宫)

实验任务 (1) 掌握顺序循环队列及其C语言的表示&#xff1b; (2) 掌握入队、出队等基本算法的实现&#xff1b; (3) 掌握顺序循环队列的基本应用&#xff08;求解迷宫通路&#xff09;。 实验内容 使用C语言实现顺序循环队列的类型定义与算法函数&#xff1b;编写main()函数…

算法与数据结构(三)--栈

一.栈的基本概念 栈是一种特殊的表&#xff0c;这种表只在表首进行插入和删除操作。 因此&#xff0c;表首对于栈来说具有特殊的意义&#xff0c;称为栈顶。相应的&#xff0c;表尾称为栈底。不含任何元素的栈称为空栈。 栈的修改遵循后进先出的原则&#xff0c;Last In First…