flask中的werkzeug介绍

这篇具有很好参考价值的文章主要介绍了flask中的werkzeug介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

flask中的werkzeug介绍,flask,python,flask,python,后端

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。文章来源地址https://www.toymoban.com/news/detail-605020.html

到了这里,关于flask中的werkzeug介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python Flask 后端向前端推送信息——轮询、SSE、WebSocket

    后端向前端推送信息,通知任务完成 轮询 SSE WebSocket 请求方式 HTTP HTTP TCP长连接 触发方式 轮询 事件 事件 优点 实现简单易兼容 实现简单开发成本低 全双工通信,开销小,安全,可扩展 缺点 消耗较大 不兼容IE 传输数据需二次解析,开发成本大 适用场景 服务端向客户端单向

    2023年04月19日
    浏览(82)
  • 【python】flask模板渲染引擎Jinja2,通过后端数据渲染前端页面

    ✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN新星创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开

    2024年04月11日
    浏览(53)
  • Python Web 开发 Flask 介绍

    WEB开发是现在程序必会的技能,因为大部分软件都以Web形式提供,及时制作后台开发,或者只做前台开发,也需要了解Web开发的概念和特点。由于Python是解释性脚本语言,用来做Web开发非常适合,而且Python有上百种Web开发框架,以及成熟的模板技术,使得Web开发如虎添翼。今

    2024年02月14日
    浏览(40)
  • python在flask中的请求数据“无限流”

    在flask请求中,有个需求是让调用方一直调接口,并立马返回,而接口方缓存请求,依次执行。 注意: 需要注意的是, request_queue.get() 之后队列里的值就直接推出了,不用显式推出。 以上就可以做到讲请求立刻返回,接口缓存请求内容自我\\\"消化\\\"。Enjoy~ ∼ O n e   p e r s o n  

    2024年02月21日
    浏览(35)
  • 【毕设必备】手把手带你用Python搭建一个简单的后端服务- API的创建,前后端交互的数据传递,GET,POST,JSON,FLASK

    Python是一种 流行 的高级编程语言,具有易于学习和使用的特性,被广泛应用于各种领域。 简单易学 :Python的语法清晰简洁,易于理解和学习。与其他编程语言相比,Python的语法设计非常直观,使得编程新手也能快速上手。 强大的标准库和丰富的第三方库 :Python拥有一个庞

    2024年02月04日
    浏览(145)
  • 后端框架flask学习小记

    最近在和几个伙伴尝试搭建一个新闻推荐系统, 算是一个推荐算法的实战项目, 里面涉及到了前后端交互, 该项目里面,使用了Flask作为后台框架, 为了理清楚整个系统的交互,所以就快速参考着资料学习了下flask, 主要还是参考伙伴们写的flask简介和基础的内容, 加上了

    2023年04月27日
    浏览(42)
  • 搭建flask后端和微信小程序前端

    目录 一、准备工作 (1)我的前端代码 (2)我的后端代码 (3)后端运行成功的截图 (4)前端运行成功的截图  (5)整体运行成功的截图 二、部署后端  (1)在腾讯云的学生入口处购买服务器(建议选择ubuntu系统),设置管理秘钥,方便在本地远程连接。 (2)在本地的

    2024年02月04日
    浏览(52)
  • Flask后端开发(一)-基础知识和前期准备

    目录 1.背景介绍 1.1. 项目背景 1.2. 项目难点 1.3. 项目环境 2. flask后端开发实现的功能 3. flask部署和前后端对接 3.1. flask运行配置和服务器部署 3.2. flask前后端传参 4. 后端测试工具 4.1. 工具介绍 4.2. 工具使用 后记 就是前几个月临时接手了一个后端项目,使用python flask框架进行后

    2024年02月08日
    浏览(49)
  • 深入解析域名短链接生成原理及其在Python/Flask中的实现策略:一篇全面的指南与代码示例

    为了构建一个高效且用户友好的域名短链服务,我们可以将项目精简为以下核心功能板块: 1. 用户管理 注册与登录 :允许用户创建账户并登录系统。 这部分内容可以参考另一片文章实现: 快速实现用户认证:使用Python和Flask配合PyJWT生成与解密Token的教程及示例代码 资料管

    2024年02月22日
    浏览(53)
  • flask后端进行yolov5检测模型的部署(填坑)

    麻痹的搞了我一整天,蛋疼 本来想把检测模型或者rtsp实时流部署到后端。网上有人推荐一个github项目 https://github.com/muhk01/Yolov5-on-Flask 后来有人把这个项目给修改了,运行起来了,我也准备运行一下 https://github.com/xugaoxiang/yolov5-flask   先把代码拉下来直接配置: 先说说修改的

    2023年04月09日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包