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程序屏幕居中方法
Mar 10 Python
进一步理解Python中的函数编程
Apr 13 Python
python实现Adapter模式实例代码
Feb 09 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
Apr 19 Python
使用python编写udp协议的ping程序方法
Apr 22 Python
python实现点对点聊天程序
Jul 28 Python
在win10和linux上分别安装Python虚拟环境的方法步骤
May 09 Python
python安装pil库方法及代码
Jun 25 Python
pyqt5 使用cv2 显示图片,摄像头的实例
Jun 27 Python
pyenv与virtualenv安装实现python多版本多项目管理
Aug 17 Python
python之PyQt按钮右键菜单功能的实现代码
Aug 17 Python
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
Apr 06 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
桌面中心(二)数据库写入
2006/10/09 PHP
php5编程中的异常处理详细方法介绍
2008/07/29 PHP
PHP实现格式化文件数据大小显示的方法
2015/01/03 PHP
javascript中如何处理引号编码"
2013/08/15 Javascript
JavaScript中的包装对象介绍
2015/01/27 Javascript
jQuery验证插件validation使用指南
2015/04/21 Javascript
js实现使用鼠标拖拽切换图片的方法
2015/05/04 Javascript
JavaScript中日期的相关操作方法总结
2015/10/24 Javascript
jQuery+css实现的换页标签栏效果
2016/01/27 Javascript
Bootstrap学习笔记之css组件(3)
2016/06/07 Javascript
jquery.Jcrop结合JAVA后台实现图片裁剪上传实例
2016/11/05 Javascript
浅谈JS验证表单文本域输入空格的问题
2017/02/14 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
jQuery简单实现对数组去重及排序操作实例
2017/10/31 jQuery
mongodb初始化并使用node.js实现mongodb操作封装方法
2019/04/02 Javascript
使用layer模态框给新页面传值的方法
2019/09/27 Javascript
基于Vue实现微前端的示例代码
2020/04/24 Javascript
Taro小程序自定义顶部导航栏功能的实现
2020/12/17 Javascript
Vue实现简易购物车页面
2020/12/30 Vue.js
利用 JavaScript 实现并发控制的示例代码
2020/12/31 Javascript
python中执行shell的两种方法总结
2017/01/10 Python
Python将DataFrame的某一列作为index的方法
2018/04/08 Python
Python下使用Scrapy爬取网页内容的实例
2018/05/21 Python
Python实现图片拼接的代码
2018/07/02 Python
使用 Python 实现简单的 switch/case 语句的方法
2018/09/17 Python
kafka-python批量发送数据的实例
2018/12/27 Python
在linux下实现 python 监控usb设备信号
2019/07/03 Python
Django操作session 的方法
2020/03/09 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
Python之字符串的遍历的4种方式
2020/12/08 Python
python反编译教程之2048小游戏实例
2021/03/03 Python
北京-环亚运商测试题.net程序员初步测试题
2013/05/28 面试题
市场安全管理制度
2014/01/26 职场文书
浅谈Python numpy创建空数组的问题
2021/05/25 Python
SpringCloud的JPA连接PostgreSql的教程
2021/06/26 Java/Android
未发现nvidia显卡怎么办?Win11系统中未检测到nvidia显卡解决教程
2022/04/08 数码科技