python探索之BaseHTTPServer-实现Web服务器介绍


Posted in Python onOctober 28, 2017

在Python探索之SocketServer详解中我们介绍了Python标准库中的SocketServer模块,了解了要实现网络通信服务,就要构建一个服务器类和请求处理类。同时,该模块还为我们创建了不同的服务器类和请求处理类。

1.服务器类

BaseServer
TCPServer(BaseServer)
UDPServer(TCPServer)
UnixStreamServer
UnixDatagramServer

2.请求处理类

BaseRequestHandler
StreamRequestHandler(BaseRequestHandler)
DatagramRequestHandler(BaseRequestHandler)

通过服务器类和请求处理类的搭配,我们可以创建不同类型的服务器,实现不同的协议类型。本文介绍的BaseHTTPServer模块便是继承TCPServer和StreamRequestHandler,实现了Web服务器的通信。

HTTP服务器

HTTP服务器继承自SocketServer模块中的TCPServer类。它的定义非常简单,只是重写了其中的一个方法。

class HTTPServer(SocketServer.TCPServer):
  allow_reuse_address = 1  # Seems to make sense in testing environment
  def server_bind(self):
    """Override server_bind to store the server name."""
    SocketServer.TCPServer.server_bind(self)
    host, port = self.socket.getsockname()[:2]
    self.server_name = socket.getfqdn(host)
    self.server_port = port

重写的server_bind()方法主要是为了获取服务器名和端口。其余方法以及服务器的实现过程详见Python探索之SocketServer详解

此外,还可以从SocketServer模块中引入'mix-in'类,基于HTTPServer创建支持进程或线程的服务器。

HTTP请求处理基类

为了处理HTTP请求,BaseHTTPServer模块构造了HTTP请求处理基类BaseHTTPRequestHandler,它继承自SocketServer模块中的StreamRequestHandler类。

HTTP请求处理基类中有一些重要的方法:

1.handle() ——这个方法是请求处理类真正处理请求具体工作的方法,例如解析到来的请求,处理数据,并发回响应等。在BaseHTTPRequestHandler中它是一个入口文件,将调用其他的方法完成请求处理。

2.handle_one_request() ——由handle()调用,用于处理请求。其主要工作包括:

调用parse_request()方法,解析请求,获取请求报文中的信息,包括请求的方法、请求URL、请求的HTTP版本号、请求首部等。如果解析失败,则调用send_error()方法发回一个错误响应。

调用do_SPAM() 方法。这个方法中的SPAM指代GET、POST、HEAD等请求方法,需要在请求处理类中构建具体的请求处理方法,例如do_GET处理GET请求,do_POST处理POST请求。do_SPAM() 方法可以调用send_response()、send_header()、end_headers()等方法创建响应首行和响应首部等内容。

3.parse_request() ——解析请求。

4.send_error() ——发回错误响应。

5.send_response() ——创建响应首行和响应首部等内容。

6.send_header() ——设置响应首部内容。

7.end_headers() ——调用此方法可以在首部后增加一个空行,表示首部内容结束(不适用于HTTP/0.9)

8.还包括其他的一些辅助函数。

需要注意的是:BaseHTTPRequestHandler是HTTP请求处理的基类,并不包含诸如do_GET、do_POST等方法,其他继承该类的请求处理类需要自己实现这些方法,已完成对具体请求的处理。对此,可以参考SimpleHTTPServer模块,也可查看文章Python探索之实现一个简单的HTTP服务器。

总结

以上就是本文关于python探索之BaseHTTPServer-实现Web服务器介绍的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Python探索之URL Dispatcher实例详解、Python编程之Re模块下的函数介绍等,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
Python爬虫之xlml解析库(全面了解)
Aug 08 Python
使用apidocJs快速生成在线文档的实例讲解
Feb 07 Python
基于python的图片修复程序(实现水印去除)
Jun 04 Python
python 实现数字字符串左侧补零的方法
Dec 04 Python
基于Python的ModbusTCP客户端实现详解
Jul 13 Python
python retrying模块的使用方法详解
Sep 25 Python
python pygame实现滚动横版射击游戏城市之战
Nov 25 Python
Python 之 Json序列化嵌套类方式
Feb 27 Python
Python为何不支持switch语句原理详解
Oct 21 Python
Python try except else使用详解
Jan 12 Python
Python实现微信表情包炸群功能
Jan 28 Python
聊聊Python中关于a=[[]]*3的反思
Jun 02 Python
Python探索之实现一个简单的HTTP服务器
Oct 28 #Python
Python探索之SocketServer详解
Oct 28 #Python
Bottle框架中的装饰器类和描述符应用详解
Oct 28 #Python
Pandas探索之高性能函数eval和query解析
Oct 28 #Python
Python探索之URL Dispatcher实例详解
Oct 28 #Python
Python探索之Metaclass初步了解
Oct 28 #Python
Python编程之Re模块下的函数介绍
Oct 28 #Python
You might like
PHP 变量类型的强制转换
2009/10/23 PHP
php curl获取网页内容(IPV6下超时)的解决办法
2013/07/16 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
2014/04/24 PHP
thinkPHP5.0框架命名空间详解
2017/03/18 PHP
JavaScript 仿关机效果的图片层
2008/12/26 Javascript
一句话JavaScript表单验证代码
2009/08/02 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
2013/11/30 Javascript
jquery Ajax 实现加载数据前动画效果的示例代码
2014/02/07 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
2015/04/12 Javascript
JavaScritp添加url参数并将参数加入到url中及更改url参数的方法
2015/10/26 Javascript
JS中利用localStorage防止页面动态添加数据刷新后数据丢失
2017/03/10 Javascript
webpack将js打包后的map文件详解
2018/02/22 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
浅谈vue中get请求解决传输数据是数组格式的问题
2020/08/03 Javascript
JavaScript 判断浏览器是否是IE
2021/02/19 Javascript
[01:18]一目了然!DOTA2DotA快捷操作对比第一弹
2014/07/01 DOTA
[49:56]VG vs Optic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
在Python操作时间和日期之asctime()方法的使用
2015/05/22 Python
Python3访问并下载网页内容的方法
2015/07/28 Python
python将txt文档每行内容循环插入数据库的方法
2018/12/28 Python
pytorch numpy list类型之间的相互转换实例
2019/08/18 Python
tensorflow实现对张量数据的切片操作方式
2020/01/19 Python
TensorFlow 读取CSV数据的实例
2020/02/05 Python
在Mac中PyCharm配置python Anaconda环境过程图解
2020/03/11 Python
解决jupyter notebook 前面书写后面内容消失的问题
2020/04/13 Python
利用Python实现Json序列化库的方法步骤
2020/09/09 Python
马来西亚在线购物:POPLOOK.com
2019/12/09 全球购物
请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值
2014/09/15 面试题
公司离职证明范本
2014/01/13 职场文书
《歌唱二小放牛郎》教学反思
2014/04/19 职场文书
纪委书记群众路线整改措施思想汇报
2014/10/09 职场文书
机关干部四风问题自我剖析及整改措施
2014/10/26 职场文书
2014年司法局工作总结
2014/12/11 职场文书
婚前保证书范文
2015/02/28 职场文书
pytorch 实现变分自动编码器的操作
2021/05/24 Python