flask中的werkzeug介绍

news2024/11/18 10:29:29

在这里插入图片描述

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。

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

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

相关文章

基础入门-SpringBoot-自动配置特性

一、自动配好Tomcat 引入Tomcat依赖。配置Tomcat <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><version>2.3.4.RELEASE</version><scope>compile</sco…

同城跑腿小程序怎么做

同城跑腿小程序是一款基于地理位置的服务平台&#xff0c;为用户提供了便捷的日常生活服务。以下是该小程序的主要功能介绍&#xff1a; 1. 快速下单&#xff1a;用户可以通过小程序平台快速填写订单信息&#xff0c;包括取送地址、物品类型和重量等信息&#xff0c;然后选择合…

LabVIEW开发环境试验箱控制器

LabVIEW开发环境试验箱控制器 环境或气候试验箱是一种外壳&#xff0c;用于模拟各种材料&#xff08;包括工业产品、生物物质、复合材料、电子设备和航空航天部件&#xff09;的特定环境条件&#xff0c;并评估调节对这些材料的影响。 环境试验箱&#xff08;ETC&#xff09;…

存储过程——游标

1.游标 什么是游标&#xff0c;以及游标使用的相关语法。 #声明游标&#xff0c;存储查询结果集 #准备&#xff1a;创建表结构 #开启游标 #获取游标中的记录 #插入数据到新表中 #关闭游标 create procedure p11(in uage int) begindeclare uname varchar(100);declare upro …

Istio 故障注入与重试的实验

故障注入 Istio流量治理有故障注入的功能&#xff0c;在接收到用户请求程序的流量时&#xff0c;注入故障现象&#xff0c;例如注入HTTP请求错误&#xff0c;当有流量进入Sidecar时&#xff0c;直接返回一个500的错误请求代码。 通过故障注入可以用来测试整个应用程序的故障恢…

DYLD--动态链接器

概念 dyld&#xff08;the dynamic link editor&#xff09;是苹果的动态链接器&#xff0c;是苹果操作系统一个重要组成部分&#xff0c;在系统内核 XNU 完成 Mach-O 文件的加载&#xff0c;做好程序准备工作之后&#xff0c;交由 dyld 负责余下的工作。在 macOS 系统中&…

vue2引入lottie动画

说明下&#xff1a;如果你是vue3的话请移步&#xff1a;https://blog.csdn.net/qq_67801847/article/details/128386661&#xff0c;这里只针对vue2. 同时动画官网链接&#xff1a;lottie官网 实现思路&#xff1a; 1. 安装lottie-web (版本无所谓) 2. 在使用的页面引入组件 #…

一起来看看音频转文字怎么弄吧

从前有一个名叫小明的学生&#xff0c;他在学校里总是很喜欢录制各种有趣的音频&#xff0c;包括老师的讲课、同学们的笑声&#xff0c;以及校园里的各种声音。有一天&#xff0c;他在课堂上录下了老师的授课内容&#xff0c;想着晚上回家后再将它们转换成文字&#xff0c;便于…

网络安全(黑客)学习手册

1.什么是网络安全&#xff1f; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一是市场需求量高&#xff1b; 二则是发展…

Python+大数据开发拿到25k的offer!

随着95后、00后的登场&#xff0c;80后好似成为“古早”的存在&#xff0c;看似被生活磨平了棱角的他们&#xff0c;其实也在渴望重新“支棱”起来。今天分享的这位80后的逆袭故事&#xff0c;希望你能感受到他的力量…… 学科 | Python大数据开发 校区 | 北京 薪资 | 25k 我…

【深度学习之YOLO8】视频流推断

官方V8模型下载 需要准备两个东西 simsun.ttc字体包YOLOv8官方模型成品 ScreenCapture屏幕图像类 import cv2 import mss import numpy as npclass ScreenCapture:"""parameters----------screen_resolution : Tuple[int, int]屏幕宽高&#xff0c;分别为x&a…

5.2.11.添加读写接口

5.2.11.添加读写接口 5.2.11.1、在驱动中添加 5.2.11.2、在应用中添加 5.2.11.3、测试 1. app.c #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>#define FILE "/dev/test" // 刚才mknod创建的设…

K8S中网络如何通信

Kubernetes 提出了一个自己的网络模型“IP-per-pod”&#xff0c;能够很好地适应集群系统的网络需求&#xff0c;它有下面的这 4 点基本假设&#xff1a; 集群里的每个 Pod 都会有唯一的一个 IP 地址。Pod 里的所有容器共享这个 IP 地址。集群里的所有 Pod 都属于同一个网段。…

WT588F02B-8S 血压计语音芯片如何选型?低功耗语音ic方案

一、血压计语音提示方案需求设计&#xff1f; 血压计语音提示方案的需求设计是为了实现在测量血压过程中&#xff0c;通过语音提示用户操作指引、测量结果和健康建议等功能。以下是血压计语音提示方案需求设计的主要需求&#xff1a; &#xff08;1&#xff09;测量操作引导 …

QT---day1(QT的介绍、常用类及组件)

代码&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//设置窗口尺寸this->setFixedSize(600,500);//设置窗口标题this->setWindowTitle(&q…

【MySQL】库和表的操作

目录 一、库的操作 1.1创建数据库 1.2创建数据库案例 1.3字符集和校验规则 &#xff08;1&#xff09;查看系统默认字符集以及校验规则 &#xff08;2&#xff09;查看数据库支持的字符集 &#xff08;3&#xff09;查看数据库支持的字符集校验规则 &#xff08;4&…

万向节死锁

要理解万向节死锁的产生原因&#xff0c;首先要理解欧拉角变换&#xff0c;欧拉角变换是基于最初始的坐标进行变换而非变换后的坐标进行变换。 欧拉角变换需要空间中的三个角&#xff08;即变换后每个轴的偏移量&#xff09;&#xff0c;另外还有每个轴的变换顺序。值得注意的…

SpringSecurity6--认证和授权的原理

SpringSecurity6–认证和授权的原理&#xff0c;项目gitee地址在文章末尾。 文章目录 一、Spring Security简介二、Spring Security框架中认证流程中几个非常重要的类1、 FilterChainProxy2、 AbstractAuthenticationProcessingFilter3、 UsernamePasswordAuthenticationFilter…

打开Android device monitor

X:\assdk\tools monitor.bat 双击 更新到最新

如何优雅地下载huggingface上模型,以llama2模型下载为例

背景 由于llama2模型的下载需要经过官方的授权&#xff0c;这就需要登陆hugging face的&#xff0c;对模型页面进行申请。等待审核通过后&#xff0c;才能够下载。如果在单纯用 git lfs 的方式进行下载&#xff0c;需要输入账号和密码。为了更快速地进行下载&#xff0c;既能够…