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的tkinter布局之简单的聊天窗口实现方法
Sep 03 Python
简要讲解Python编程中线程的创建与锁的使用
Feb 28 Python
Python中格式化format()方法详解
Apr 01 Python
python psutil库安装教程
Mar 19 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
Apr 18 Python
python实现画一颗树和一片森林
Jun 25 Python
Linux上使用Python统计每天的键盘输入次数
Apr 17 Python
python反编译学习之字节码详解
May 19 Python
Python 装饰器原理、定义与用法详解
Dec 07 Python
简单了解Python3 bytes和str类型的区别和联系
Dec 19 Python
Django之form组件自动校验数据实现
Jan 14 Python
Django REST framwork的权限验证实例
Apr 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
Google Voice 短信发送接口PHP开源版(2010.5更新)
2010/07/22 PHP
PHP操作数组的一些函数整理介绍
2011/07/17 PHP
win7下memCache的安装过程(具体操作步骤)
2013/06/28 PHP
PHP实现HTTP断点续传的方法
2015/06/17 PHP
反射调用private方法实践(php、java)
2015/12/21 PHP
php递归函数怎么用才有效
2018/02/24 PHP
PHP进阶学习之依赖注入与Ioc容器详解
2019/06/19 PHP
cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失
2009/06/04 Javascript
jQuery 选择器理解
2010/03/16 Javascript
很棒的学习jQuery的12个网站推荐
2011/04/28 Javascript
关于JS字符串函数String.replace()
2013/04/07 Javascript
jquery实现的可隐藏重现的靠边悬浮层实例代码
2013/05/27 Javascript
JavaScript常用小技巧小结
2014/12/29 Javascript
从源码看angular/material2 中 dialog模块的实现方法
2017/10/18 Javascript
node使用promise替代回调函数
2018/05/07 Javascript
js前端面试之同步与异步问题详解
2019/04/03 Javascript
对layer弹出框中icon数字参数的说明介绍
2019/09/04 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
[45:14]Optic vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
Python的Tornado框架实现图片上传及图片大小修改功能
2016/06/30 Python
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
2018/06/26 Python
Python实现在某个数组中查找一个值的算法示例
2018/06/27 Python
PyCharm导入python项目并配置虚拟环境的教程详解
2019/10/13 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
2019/11/30 Python
python读写文件write和flush的实现方式
2020/02/21 Python
基于Numba提高python运行效率过程解析
2020/03/02 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
无需压缩软件,用python帮你操作压缩包
2020/08/17 Python
运动会入场式解说词
2014/02/18 职场文书
人代会标语
2014/06/30 职场文书
纪念九一八爱国演讲稿600字
2014/09/14 职场文书
2014年居委会工作总结
2014/12/09 职场文书
医院办公室主任岗位职责
2015/04/01 职场文书
幼儿园托班开学寄语(2015秋季)
2015/05/27 职场文书
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python
vscode中使用npm安装babel的方法
2021/08/02 Javascript