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中redis的安装和使用
Dec 04 Python
详解python 发送邮件实例代码
Dec 22 Python
Python守护线程用法实例
Jun 23 Python
Python 比较两个数组的元素的异同方法
Aug 17 Python
django文档学习之applications使用详解
Jan 29 Python
浅谈python中拼接路径os.path.join斜杠的问题
Oct 23 Python
python引用(import)某个模块提示没找到对应模块的解决方法
Jan 19 Python
python ubplot使用方法解析
Jan 10 Python
如何教少儿学习Python编程
Jul 10 Python
python 生成器需注意的小问题
Sep 29 Python
如何用Python徒手写线性回归
Jan 25 Python
python字符串常规操作大全
May 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文件
2007/01/04 PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
2013/08/16 PHP
php中preg_replace_callback函数简单用法示例
2016/07/21 PHP
jsTree树控件(基于jQuery, 超强悍)[推荐]
2009/09/01 Javascript
javascript获取网页中指定节点的父节点、子节点的方法小结
2013/04/24 Javascript
JavaScript中Boolean对象的属性解析
2015/10/21 Javascript
JavaScript 七大技巧(二)
2015/12/13 Javascript
javascript计时器编写过程与实现方法
2016/02/29 Javascript
30分钟快速掌握Bootstrap框架
2016/05/24 Javascript
原生js的数组除重复简单实例
2016/05/24 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
2016/09/14 Javascript
关于 jQuery Easyui异步加载tree的问题解析
2016/12/06 Javascript
深入理解javascript中concat方法
2016/12/12 Javascript
jQuery+C#实现参数RSA加密传输功能【附jsencrypt.js下载】
2017/06/26 jQuery
详解Vue2.x-directive的学习笔记
2017/07/17 Javascript
微信小程序使用Vant Weapp组件库的方法步骤
2019/08/01 Javascript
ant design vue中日期选择框混合时间选择器的用法说明
2020/10/27 Javascript
python解析xml文件实例分享
2013/12/04 Python
一个超级简单的python web程序
2014/09/11 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
2017/11/30 Python
在python中实现对list求和及求积
2018/11/14 Python
django admin组件使用方法详解
2019/07/19 Python
Python求解正态分布置信区间教程
2019/11/20 Python
Python 求数组局部最大值的实例
2019/11/26 Python
pytorch梯度剪裁方式
2020/02/04 Python
python用pip install时安装失败的一系列问题及解决方法
2020/02/24 Python
python GUI计算器的实现
2020/10/09 Python
Html5游戏开发之乒乓Ping Pong游戏示例(一)
2013/01/21 HTML / CSS
html5图片上传预览示例分享
2014/04/14 HTML / CSS
国际书籍零售商:Wordery
2017/11/01 全球购物
兼职业务员岗位职责
2014/01/01 职场文书
厂长岗位职责
2014/02/19 职场文书
连带责任保证书
2014/04/29 职场文书
2014年银行客户经理工作总结
2014/11/12 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS
LeetCode189轮转数组python示例
2022/08/05 Python