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代码
Mar 13 Python
python基础教程之基本数据类型和变量声明介绍
Aug 29 Python
python私有属性和方法实例分析
Jan 15 Python
对于Python装饰器使用的一些建议
Jun 03 Python
python3新特性函数注释Function Annotations用法分析
Jul 28 Python
Python探索之ModelForm代码详解
Oct 26 Python
python 用正则表达式筛选文本信息的实例
Jun 05 Python
在python中只选取列表中某一纵列的方法
Nov 28 Python
PyQt打开保存对话框的方法和使用详解
Feb 27 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
Feb 03 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
Nov 17 Python
Matplotlib animation模块实现动态图
Feb 25 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
腾讯微博提示missing parameter errorcode 102 错误的解决方法
2014/12/22 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
2015/09/23 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
2017/05/02 PHP
PHP实现验证码校验功能
2017/11/16 PHP
JavaScript几种形式的树结构菜单
2010/05/10 Javascript
js 通用javascript函数库整理
2011/08/14 Javascript
关于jQuery的inArray 方法介绍
2011/10/08 Javascript
封装的jquery翻页滚动(示例代码)
2013/11/18 Javascript
查找Oracle高消耗语句的方法
2014/03/22 Javascript
node.js中的fs.write方法使用说明
2014/12/15 Javascript
JavaScript中Cookie操作实例
2015/01/09 Javascript
jQuery中大家不太了解的几个方法
2015/03/04 Javascript
深入探讨javascript函数式编程
2015/10/11 Javascript
Angular4 中常用的指令入门总结
2017/06/12 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
2018/02/23 Javascript
Nodejs使用Mongodb存储与提供后端CRD服务详解
2018/09/04 NodeJs
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
Python不规范的日期字符串处理类
2014/06/10 Python
详解Python读取配置文件模块ConfigParser
2017/05/11 Python
用virtualenv建立多个Python独立虚拟开发环境
2017/07/06 Python
基于多进程中APScheduler重复运行的解决方法
2019/07/22 Python
django rest framework 过滤时间操作
2020/07/12 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
Jupyter安装链接aconda实现过程图解
2020/11/02 Python
HTML5 拖拽批量上传文件的示例代码
2018/03/28 HTML / CSS
前端使用canvas生成盲水印的加密解密的实现
2020/12/16 HTML / CSS
Groupon西班牙官方网站:在线优惠券和交易,节省高达70%
2021/03/13 全球购物
护士实习生自我鉴定范文
2013/12/10 职场文书
《金子》教学反思
2014/04/13 职场文书
工作分析计划书
2014/04/30 职场文书
大学生求职信
2014/06/17 职场文书
2014年教研工作总结
2014/12/06 职场文书
2015年保育员个人工作总结
2015/05/13 职场文书
公司处罚决定书
2015/06/24 职场文书
七年级作文之秋游
2019/10/21 职场文书