我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python中httptools模块如何使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python中httptools模块如何使用

这篇文章主要介绍“Python中httptools模块如何使用”,在日常操作中,相信很多人在Python中httptools模块如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中httptools模块如何使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

如果你用过 FastAPI 的话,那么你一定知道 uvicorn,它是一个基于 uvloop 和 httptools 实现的高性能 ASGI 服务器

其中 uvloop 采用 Cython 编写,用于替换 asyncio 中的事件循环,可以让 asyncio 速度增加 2 到 4 倍。而 httptools 是基于 C 语言实现的 HTTP 解析器,用来解析 HTTP 请求的。

httptools 是一个 HTTP 解析器,它首先提供了一个 parse_url 函数,用来解析 URL。

import httptools# 第一个参数必须是 bytes 对象url = httptools.parse_url(    b"http://www.baidu.com")# 返回一个 URL 对象print(url.__class__)"""<class 'httptools.parser.parser.URL'>"""

那么这个 URL 对象有哪些属性呢?

Python中httptools模块如何使用

通过源码可知,总共有七个属性,我们来测试一下。

import httptools# 第一个参数是 bytes 对象url = b"http://satori:123456@www.baidu.com:80/s?wd=koishi#flag"url_obj = httptools.parse_url(url)print("协议:", url_obj.schema)print("IP:", url_obj.host)print("端口:", url_obj.port)print("路径:", url_obj.path)print("查询参数:", url_obj.query)print("锚点:", url_obj.fragment)print("用户信息:", url_obj.userinfo)"""协议: b'http'IP: b'www.baidu.com'端口: 80路径: b'/s'查询参数: b'wd=koishi'锚点: b'flag'用户信息: b'satori:123456'"""

比较简单,如果参数不符合 URL 的标准格式,那么会抛出 HttpParserInvalidURLError 错误。

然后是 HTTP 请求报文和响应报文的解析,因为报文只是一坨字节流,需要将它解析成某个 Request 对象或 Response 对象,而 httptools 就是干这件事情的。

首先来看一下报文格式,请求报文如下:

Python中httptools模块如何使用

接下来是响应报文:

Python中httptools模块如何使用

所以无论是请求报文还是响应报文,都由 起始行 + 请求头/响应头 + 请求体/响应体 组成。而我们在拿到原始的报文之后,也可以很方便地进行解析,从图中可以看出最后一个 Header 字段和响应体之间有两个换行,而换行用 \r\n 表示。因此我们只要按照 "\r\n\r\n" 进行 split 即可,会得到一个数组,数组的第二个元素就是请求体/响应体,第一个元素就是起始行 + 请求头/响应头。

然后对数组的第一个元素按照 "\r\n" 再进行 split,又可以得到一个数组,该数组的第一个元素就是起始行,剩余的元素就是请求头/响应头。

所以我们在拿到报文之后,完全可以自己手动解析,但 httptools 是用 C 实现的,所以速度会快一些,但干的事情是一样的。下面来看看 httptools 如何解析请求报文:

from pprint import pprintimport httptools# 请求报文request_payload = b"""POST /index?a=1 HTTP/1.1Host: localhost:8080Connection: keep-aliveContent-Length: 26Cache-Control: max-age=0Upgrade-Insecure-Requests: 1Accept: text/htmlAccept-Encoding: gzip, deflate, sdchCookie: _octo=GH1.1.1989111283.1493917476; logged_in=yes{"name":"satori","age":17}"""class Request:    """    将请求报文的解析结果封装成 Request 对象    """    def __init__(self):        self.headers = {}        self.body = b""        self.path = None    def on_url(self, path: bytes):        self.path = path    def on_header(self, name: bytes, value: bytes):        self.headers[name] = value    def on_body(self, body: bytes):        self.body = body# 实例化 Request 对象request = Request()# 将 request 作为参数传到 HttpRequestParser 中parser = httptools.HttpRequestParser(request)# 传入请求报文,进行解析parser.feed_data(request_payload)# 获取 HTTP 版本print(parser.get_http_version())"""1.1"""# 是否是长链接(Connection 指定为 keep-alive)print(parser.should_keep_alive())"""True"""# 获取请求方法print(parser.get_method())"""b'POST'"""# 以上几个都是 HttpRequestParser 对象的方法# 获取路径print(request.path)"""b'/index?a=1'"""# 获取请求头pprint(request.headers)"""{b'Accept': b'text/html', b'Accept-Encoding': b'gzip, deflate, sdch', b'Cache-Control': b'max-age=0', b'Connection': b'keep-alive', b'Content-Length': b'26', b'Cookie': b'_octo=GH1.1.1989111283.1493917476; logged_in=yes', b'Host': b'localhost:8080', b'Upgrade-Insecure-Requests': b'1'}"""# Cookie 也是请求头的一部分,但在解析的时候会单独拿出来# 再解析成一个字典,然后通过 request.cookies 获取# 获取请求体print(request.body)"""b'{"name":"satori","age":17}'"""

以上就是请求报文的解析,再来看看响应报文。

from pprint import pprintimport httptools# 响应报文response_payload = b"""HTTP/1.1 200 OKServer: TornadoServer/6.1Content-Type: text/html; charset=UTF-8Date: Sun, 22 May 2022 17:54:11 GMTContent-Length: 21name: satori, age: 17"""class Response:    """    将响应报文的解析结果封装成 Response 对象    """    def __init__(self):        self.headers = {}        self.body = b""        self.status = b""    def on_header(self, name: bytes, value: bytes):        self.headers[name] = value    def on_body(self, body: bytes):        self.body = body    def on_status(self, status: bytes):        self.status = status# 实例化 Response 对象response = Response()# 将 response 作为参数传到 HttpResponseParser 中parser = httptools.HttpResponseParser(response)# 传入响应报文,进行解析parser.feed_data(response_payload)# 获取 HTTP 版本print(parser.get_http_version())"""1.1"""# 是否是长链接(不指定 Connection,默认为长连接)print(parser.should_keep_alive())"""True"""# 获取状态码print(parser.get_status_code())"""b'OK'"""# 获取状态码对应的描述print(response.status)"""b'OK'"""# 获取响应头pprint(response.headers)"""{b'Content-Length': b'21', b'Content-Type': b'text/html; charset=UTF-8', b'Date': b'Sun, 22 May 2022 17:54:11 GMT', b'Server': b'TornadoServer/6.1'}"""# 获取响应体print(response.body)"""b'name: satori, age: 17'"""

以上就是请求报文和响应报文的解析,但如果你不是手动发送 TCP 请求的话,那么该模块基本用不到。因为对于任何一个成熟的模块而言,都具备了报文解析功能。像 requests, httpx, aiohttp 等等,以及一些 web 框架,它们在拿到报文之后会自动解析成某个对象,我们直接通过指定的属性获取即可。

而 httptools 便是 uvicorn 的报文解析器,我们在使用 uvicorn 的时候,uvicorn 内部也会自动通过 httptools 将报文解析好,而不需要我们手动解析。

因此这里介绍的 httptools 了解一下即可,我们只需要知道它是基于 C 实现的,性能非常高就行。但我们不会手动使用它,而是在使用某个框架(uvicorn)的时候,由框架自动帮我们将报文解析好。

到此,关于“Python中httptools模块如何使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python中httptools模块如何使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python中httptools模块如何使用

这篇文章主要介绍“Python中httptools模块如何使用”,在日常操作中,相信很多人在Python中httptools模块如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中httpto
2023-07-05

详解Python中httptools模块的使用

httptools 是一个 HTTP 解析器,它首先提供了一个 parse_url 函数,用来解析 URL。这篇文章就来和大家聊聊它的用法吧,感兴趣的可以了解一下
2023-03-03

python中如何使用smtplib模块

python中如何使用smtplib模块,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。说明1、创建SMTP的操作对象,连接smtp目标服务器,可以是163、QQ等。2、根据
2023-06-20

python中如何使用 String模块

本篇文章为大家展示了python中如何使用 String模块,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。string成员常量:ascii_letters = abcdefghijklmnopqrs
2023-06-17

 Python中logging模块如何使用

这篇文章主要讲解了“ Python中logging模块如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ Python中logging模块如何使用”吧!1.为什么要用logging模块在
2023-06-29

python中utils模块如何使用

在Python中,utils模块通常是一个包含一些常用的工具函数的模块。要使用utils模块中的功能,首先需要导入该模块:import utils然后就可以调用utils模块中的函数了。例如,假设utils模块中有一个名为print_me
python中utils模块如何使用
2024-04-03

Python中 Collections 模块如何使用

今天就跟大家聊聊有关Python中 Collections 模块如何使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。collections模块是一个不用不知道,一用就上瘾的模块。这
2023-06-15

Python中如何使用py2exe模块

这期内容当中小编将会给大家带来有关Python中如何使用py2exe模块,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.我们先准备一个简单的pythonPythonhello.py# hello.py
2023-06-17

python中threading模块如何使用

本篇内容介绍了“python中threading模块如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、Thread的使用目标函数可以
2023-07-06

Python中base64模块如何使用

Python中base64模块如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python base64模块是用来作base64编码解码的。这种编码方式在
2023-06-17

Python中itertools模块如何使用

这篇文章主要介绍“Python中itertools模块如何使用”,在日常操作中,相信很多人在Python中itertools模块如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中iterto
2023-07-05

python中os模块如何使用

这篇文章主要介绍了python中os模块如何使用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。python有哪些常用库python常用的库:1.requesuts;2.scr
2023-06-14

Python中ConfigParser模块如何使用

Python中ConfigParser模块如何使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在程序中使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并
2023-06-17

python中如何使用matplotlib模块

这篇文章给大家介绍python中如何使用matplotlib模块,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。  常见的激活函数效果图如下:  代码区:  #!E:\anaconda\python.exe  # -*-
2023-06-02

python中如何使用email模块

python中如何使用email模块,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。说明1、email模块支持发送的邮件内容包括纯文本、HTML内容、图片和附件。2、email模
2023-06-20

python中如何使用os模块

小编给大家分享一下python中如何使用os模块,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python是什么意思Python是一种跨平台的、具有解释性、编译性
2023-06-14

python中如何使用contextvars模块

这篇“python中如何使用contextvars模块”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python中如何使用c
2023-07-06

如何在Python中使用pickle模块

这篇文章将为大家详细讲解有关如何在Python中使用pickle模块,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科
2023-06-14

Python中的binascii模块如何使用

这篇文章主要介绍“Python中的binascii模块如何使用”,在日常操作中,相信很多人在Python中的binascii模块如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中的binas
2023-06-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录