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的爬虫包Beautiful Soup中用正则表达式来搜索
Jan 20 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
Nov 02 Python
Python实现矩阵加法和乘法的方法分析
Dec 19 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
Feb 01 Python
python将文本分每两行一组并保存到文件
Mar 19 Python
Flask框架实现给视图函数增加装饰器操作示例
Jul 16 Python
用Python实现大文本文件切割的方法
Jan 12 Python
我们为什么要减少Python中循环的使用
Jul 10 Python
pycharm通过ssh连接远程服务器教程
Feb 12 Python
学会python自动收发邮件 代替你问候女友
May 20 Python
解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题
Jun 17 Python
python 基于wx实现音乐播放
Nov 24 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
PHP中date()日期函数有关参数整理
2011/07/19 PHP
iis下php mail函数的sendmail配置方法(官方推荐)
2012/04/25 PHP
destoon官方标签大全
2014/06/20 PHP
Thinkphp+smarty+uploadify实现无刷新上传
2015/07/30 PHP
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
2015/10/20 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
2016/06/13 PHP
详解Yii2高级版引入bootstrap.js的一个办法
2017/03/21 PHP
PDO::setAttribute讲解
2019/01/29 PHP
jquery 插件 web2.0分格的分页脚本,可用于ajax无刷新分页
2008/12/25 Javascript
javascript中的关于类型转换的性能优化
2010/12/14 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
JavaScript异步回调的Promise模式封装实例
2014/06/07 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
2015/10/26 Javascript
jQuery+Ajax实现无刷新操作
2016/01/04 Javascript
jQuery validate验证插件使用详解
2016/05/11 Javascript
JavaScript 最佳实践:帮你提升代码质量
2016/12/03 Javascript
微信小程序  TLS 版本必须大于等于1.2问题解决
2017/02/22 Javascript
[55:04]海涛DOTA2死魂复燃6.82版本介绍
2014/09/28 DOTA
python 转换 Javascript %u 字符串为python unicode的代码
2016/09/06 Python
python学习必备知识汇总
2017/09/08 Python
Numpy截取指定范围内的数据方法
2018/11/14 Python
有关Tensorflow梯度下降常用的优化方法分享
2020/02/04 Python
Pytorch maxpool的ceil_mode用法
2020/02/18 Python
一款纯css3实现的颜色渐变按钮的代码教程
2014/11/12 HTML / CSS
洲际酒店集团大中华区:IHG中国
2016/08/17 全球购物
越南综合购物网站:Lazada越南
2019/06/10 全球购物
英国床垫和床架购物网站:Bedman
2019/11/04 全球购物
工程师自我评价怎么写
2013/09/19 职场文书
高校毕业生自我鉴定
2013/10/27 职场文书
学生会干部自荐信
2014/02/04 职场文书
开朗女孩的自我评价
2014/02/10 职场文书
会计专业导师推荐信
2014/03/08 职场文书
学前班评语大全
2014/05/04 职场文书
写景作文评语集锦
2014/12/25 职场文书
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python