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, Response

def 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_simple
    run_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_simple
    run_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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

gazebo学习记录(杂乱)

一、完整系列教程 如何使用gazebo进行机器人仿真(很重要):https://zhuanlan.zhihu.com/p/367796338 基础教程和关键概念讲解(很重要):https://zhuanlan.zhihu.com/p/363385163 古月居:http://w…

ffmpeg批量分割视频解决视频前几秒黑屏的问题解决

echo 请输入视频地址: set /p fp echo 请输入开始时间: set /p st echo 请输入结束时间: set /p et echo 请输入分片时间: set /p sgt echo 注意:循环范围参数要空格。 for /l %%i in (%st%, %sgt%, %et%) do call :aa…

《TCP IP网络编程》第十二章

第 12 章 I/O 复用 12.1 基于 I/O 复用的服务器端 多进程服务端的缺点和解决方法: 为了构建并发服务器,只要有客户端连接请求就会创建新进程。这的确是实际操作中采用的一种方案,但并非十全十美,因为创建进程要付出很大的代价。…

了解Unity编辑器 之组件篇Effects(十一)

一、Halo:是一个可用于游戏对象的特效组件,它可以在对象周围添加一个光晕效果 Color属性: 用于设置Halo的颜色。你可以通过选择颜色面板中的颜色来指定光晕的外观。选择适当的颜色可以使光晕与游戏场景中的其他元素相匹配或突出显示。 Size属性: 用于设…

利用读时建模等数据分析能力,实现网络安全态势感知的落地

摘要:本文提出一种基于鸿鹄数据平台的网络安全态势感知系统,系统借助鸿鹄数据平台读时建模、时序处理、数据搜索等高效灵活的超大数据存储和分析处理能力,支持海量大数据存储、分类、统计到数据分析、关联、预测、判断的网络安全态势感知能力…

【Docker】制作Docker私有仓库

文章目录 1. 安装私有镜像仓库2. 镜像仓库可视化3. 参考资料 1. 安装私有镜像仓库 由于之后我们需要推送到私有镜像仓库,我们预先安装好,使用的是Docker公司开发的私有镜像仓库Registry。 下载Registry的Docker镜像; docker pull registry:2使…

❤️创意网页:创意视觉效果粒子循环的网页动画

✨博主:命运之光 🌸专栏:Python星辰秘典 🐳专栏:web开发(简单好用又好看) ❤️专栏:Java经典程序设计 ☀️博主的其他文章:点击进入博主的主页 前言:欢迎踏入…

k8s: kubectl: logs: rotate 问题

设计文档: https://github.com/kubernetes/design-proposals-archive/blob/main/node/kubelet-cri-logging.md https://kubernetes.io/docs/concepts/cluster-administration/logging/ 当kubenet存放container的日志满了的时候,会发生rotate,当rotate发生的时候,是由kubec…

分布式I/O,IT和OT融合少不了它

长期以来信息技术IT和操作运营技术OT是相互隔离的,随着大数据分析和边缘计算业务的对现场级实时数据的采集需求,IT和OT有了逐渐融合的趋势。IT与OT融合,它赋予工厂的管理者监控运行和过程的能力大为增强,甚至可以预测到可能发生的…

day48-ajax+SSM分页

AjaxSSM分页 非分页版controller及html: 分页模糊查询controller: Postman测试(无网页): 分页网页: 分页网页中添加模糊查询: 分页网页中实现添加功能: (1&am…

JAVASE---数据类型与变量

1. 字面常量 常量即程序运行期间,固定不变的量称为常量,比如:一个礼拜七天,一年12个月等。 public class Demo{ public static void main(String[] args){ System.Out.println("hello world!"); System.Out.println(…

QT【day4】

chat_QT服务器端&#xff1a; //.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpServer> //服务器类 #include<QTcpSocket> //客户端类 #include<QMessageBox> //对话框类 #include<QList> //链表容器 #inc…

操作系统攻击:早期WindowsMS10-046漏洞

目录 概述 漏洞成因 利用过程 漏洞复现 漏洞修复 概述 本次介绍早期的windows高危漏洞——MS10_046_SHORTCUT_ICON_DLLLOADER &#xff0c; 该漏洞可以通过浏览器跳转网络资源的方式利用&#xff0c;结合xss攻击用户的系统 危险性极高。 漏洞成因 漏洞成因&#xff1a; m…

c++的函数定义中,只提供形参类型,不提供形参名

如上图所示&#xff0c;显示了 c 语法里的一种不常见的应用。若没有对某个形参的后续使用的要求&#xff0c;可以不提供形参名的&#xff0c;也能编译通过。这么写法的作用&#xff0c;可以以第一个参数的类型不同&#xff0c;来实现函数的重载。在阅读源码&#xff0c;在vs201…

面试总结-Redis篇章(八)——Redis分布式锁

JAVA 面试总结-Redis分布式锁 模拟抢券场景通过下面方法添加Synchronized锁来防止上述情况&#xff0c;如果上面是单体服务没有问题&#xff0c;但是如果项目是集群部署&#xff0c;会出现下面的问题&#xff0c;因为Synchronized是属于本地的锁端口8080和8081同时访问&#xf…

【状态估计】基于UKF、AUKF的电力系统负荷存在突变时的三相状态估计研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

51单片机——串行口通信

目录 1、51单片机串口通信介绍 2、串行口相关寄存器 2.1 、串行口控制寄存器SCON和PCON 2.1.1 SCON&#xff1a;串行控制寄存器 (可位寻址) 2.1.2 PCON&#xff1a;电源控制寄存器&#xff08;不可位寻址&#xff09; 2.2、串行口数据缓冲寄存器SBUF 2.3、从机地址控制…

微信小程序完整项目实战(前端+后端)

基于微信小程序的在线商城点单系统 前言&#xff1a;闲来无事&#xff0c;想以后自己开一个小超市或者小吃店&#xff0c;能够支持线上下单&#xff0c;既方便客户也方便自己。系统采用C#语言作为后端实现与小程序的交互&#xff0c;给用来学习或者想自己开个小店的朋友当个参考…

C语言假期作业 DAY 01

题目 1.选择题 1、执行下面程序&#xff0c;正确的输出是&#xff08; &#xff09; int x5,y7; void swap() { int z; zx; xy; yz; } int main() { int x3,y8; swap(); printf("%d,%d\n"&#xff0c;x, y)…

VS+QT+PCL点云显示转网格表面体窗体实现

程序示例精选 VSQTPCL点云显示转网格表面体窗体实现 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<VSQTPCL点云显示转网格表面体窗体实现>>编写代码&#xff0c;代码整洁&…