python工具包大全_python 库 包 模块

python工具包大全_python 库 包 模块首先,先向大家介绍一下什么是werkzeug,Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库。这里稍微说一下,werkzeug不是一个web服务器,也不是一个web框架,而是一个工具包,官方的介绍说是一个WSGI工具包,它可以作为一个Web框架的底层库,因为它封装好了很多Web框架的东西,例如Request,Response等等。例如我最常用的Flask框架就是一Werkzeug为基础开发的,这也是我要解析一下Werkzeug底层的原因,因为我想

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

首先,先向大家介绍一下什么是 werkzeug,Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库。这里稍微说一下, werkzeug 不是一个web服务器,也不是一个web框架,而是一个工具包,官方的介绍说是一个 WSGI 工具包,它可以作为一个 Web 框架的底层库,因为它封装好了很多 Web 框架的东西,例如 Request,Response 等等。

例如我最常用的 Flask 框架就是一 Werkzeug 为基础开发的,这也是我要解析一下 Werkzeug 底层的原因,因为我想知道 Flask 的实现逻辑以及底层控制。这篇文章没有涉及到 Flask 的相关内容,只是以 Werkzeug 创建一个简单的 Web 应用,然后以这个 Web 应用为例剖析请求的处理以及响应的产生过程。

下面我们以一个简短的例子开始,先看看怎么使用 werkzeug,然后再逐步刨析 werkzeug 的实现原理。

安装 werkzeug

我希望读者是在 virtualenv 环境中跟着我的步伐走得,如果你还不知道什么是 virtualenv,那么你可以在我的博客中搜索一下 virtualenv,然后先弄好,再继续,因为很可能因为一些库的冲突等问题导致你看不到本文中介绍的东西。

ok,下面开始安装 werkzeug,

1

pip install Werkzeug

这条命令下去,几秒钟之后你就可以使用 werkzeug 了。

一个简单地 web 服务器

接下来,我们就开始使用 werkzeug 来创建一个简单的 web 服务器,这个服务器就仅仅返回 “Hello Werkzeug”,没有其他内容。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

#!/usr/bin/env python

# encoding: utf-8

import os

 

from werkzeug.serving import run_simple

from werkzeug.wrappers import Request, Response

from werkzeug.wsgi import SharedDataMiddleware

 

class Shortly(object):

    def dispatch_request(self, request):

        return Response(‘Hello Werkzeug!’)

 

    def wsgi_app(self, environ, start_response):

        request = Request(environ)

        response = self.dispatch_request(request)

        return response(environ, start_response)

 

    def __call__(self, environ, start_response):

        return self.wsgi_app(environ, start_response)

 

def create_app(with_static=True):

    app = Shortly()

    if with_static:

        app.wsgi_app = SharedDataMiddleware(app.wsgi_app, {

            ‘/static’: os.path.join(os.path.dirname(__file__), ‘static’)

        })

    return app

 

if __name__ == ‘__main__’:

    app = create_app()

    run_simple(‘127.0.0.1’, 6666, app, use_debugger=True, use_reloader=True)

这段代码就实现了我说的功能,那么我们就来看看这段代码是怎么运作的?

首先,一切都回到最开始的地方,从 main 开始看起,可以发现 main 是非常简单地,只有一个初始化函数,然后就调用了 werkzeug 的 run_simple 函数。okay,我们可以发现这个 app 其实是一个 Shortly 对象,这个类就只实现了 3 个方法,一个是 dispatch_request, wsig_app, call ,就这么简单了,那我们就知道了,关键的代码都不是这些,应该是 run_simple.

run_simple 解析

okay,我们这个系列博客的目的就是解析 werkzeug 源码,所以拿到 werkzeug 源码肯定是我们必须要做的。所以第一步我们就需要从 github 上将 werkzeug clone 下来:

1

git clone https://github.com/mitsuhiko/werkzeug.git

然后,我们就找 run_simple 的代码咯

1

vim werkzeug/serving.py

goto line 559

我们可以看到这个函数的定义,秉着关注重点的原则,我们就忽略条件判断,以一条最简单地路线来看代码,那么这里就假设:

1

2

3

use_debugger = False

static_files = False

use_reloader = False

OK, 那到这里其实 run_simple 调用的就是 inner 了,那么就来看看 inner 的代码:

1

2

3

4

5

6

7

8

9

10

11

646: try:

647:   fd = int(os.environ[‘WERKZEUG_SERVER_FD’])

648: except (LookupError, ValueError):

649:   fd = None

650: srv = make_server(hostname, port, application, threaded,

651:                   processes, request_handler,

652:                   passthrough_errors, ssl_context,

653:                   fd=fd)

654: if fd is None:

655:   log_startup(srv.socket)

656: srv.serve_forever()

忽略 fd,那么剩下一点点了:

1

2

3

4

5

6

650: srv = make_server(hostname, port, application, threaded,

651:                     processes, request_handler,

652:                   passthrough_errors, ssl_context,

653:                   fd=fd)

 

656: srv.serve_forever()

好,你应该和我一样有兴致得想知道这个 make_server 里面是什么内容了,我也很期待,那就跟上去看看。

make_server 的代码我就不贴了,还是最简原则,忽略各种条件,那么这里就假设:

1

2

threaded = False

processes = 1

那么代码也很简单了,就剩下:

1

2

546: return BaseWSGIServer(host, port, app, request_handler,

547:                       passthrough_errors, ssl_context, fd=fd)

很好,好不容易跟踪到这,终于上关键了,那就是这个 BaseWSGIServer 了,我们就来看看这个类实现了什么功能。

先看这个类的定义:

1

443: class BaseWSGIServer(HTTPServer, object):

这个类是继承自 HTTPServer 的,那么我们就有点底了,这差不多到头了,已经和 Python 的 API 碰上了。好,既然是继承自 HTTPServer,那么就把他当做 HTTPServer,然后继续看 run_simple 的代码,我们一路跟踪下来,我们发现了 656 行有一个 srv.serve_forever(),那么这不就是 HTTPServer 的用法吗? server.serve_forever() 。

okay,到这那么事情已经暂告一段落了,虽然很多事情都还没搞清楚,例如请求是怎么被封装的,响应又在哪里被处理了,例如URL路由之类的怎么操作的。但是,我们已经对 Werkzeug 有一个大概的印象了,知道他底层还是 HTTPServer 实现的,没有太多特殊的自定义协议。在下一章我们会逐步得进行进行更深层次的解密。欢迎继续关注。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/188553.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【Linux从青铜到王者】第一篇:Linux常见指令

    【Linux从青铜到王者】第一篇:Linux常见指令系列文章目录文章目录系列文章目录前言一、Linux是什么二、Linux下基本指令1.ls指令2.pwd指令3.cd指令4.touch指令5.mkdir指令6.rmdir指令7.rm指令8.man指令9.echo指令10.cp指令2.读入数据总结前言一、Linux是什么Linux是一种自由和开放源代码的类UNIX操作系统,该操作系统的内核由林纳斯托瓦兹在1991年首次发布,之后,在加上用户空间的应用程序之后,就成为了Linux操作系统。严格来讲,Linux只是操作系统内核本身,但通常采用.

    2022年5月2日
    47
  • 【Android】Android加密和解密方式

    【Android】Android加密和解密方式一、不可逆加密不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。如信息摘要(MessageDigest)和安全散列(SecureHash)算法属于此类,常见的算法包括MD5、SHA1、PBKDF2、bcrypt等。特点:使用MD5和SHA进行加解密://MD5加密privatestaticStringt

    2022年5月17日
    46
  • 深度学习中的9种归一化方法概述

    深度学习中的9种归一化方法概述9种归一化(Normalization)方法概述

    2025年7月4日
    3
  • Ubuntu忘记超级用户root密码,重新设置密码

    Ubuntu忘记超级用户root密码,重新设置密码Ubuntu 版本 Ubuntu16 04 3LTS1 启动系统 在启动过程中 反复按 Esc 键或者 shift 键 本人亲测反复按或者长按都可以 没必要纠结 直到出现以下界面 通过上下键移动 选择 Ubuntu 高级选项 或者有的版本显示的是 Advancedopti 然后按 Enter 键 进入如下界面选中 Ubuntu withLinux4 13

    2025年9月24日
    2
  • linux安装python虚拟环境_windows安装python虚拟环境

    linux安装python虚拟环境_windows安装python虚拟环境准备1、使用wget命令下载安装包,耐心等待下载。安装步骤1、安装gcc2、安装readline3、把tgz文件进行解压4、切换到python目录5、解决PIP包管理器所需依赖包。6、安装文件7、开始编译安装,自定义安装目录。8、修改系统内置Python软链接。9、针对Centos系统的一些问题Centos的包资源管理器是yum,由于该管理器是由Python语言实现的,故依赖于系统安装Python…

    2022年8月28日
    6
  • navicat2021激活码【2021最新】

    (navicat2021激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月27日
    199

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号