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之有点简约的元组
Sep 24 Python
在Python中定义和使用抽象类的方法
Jun 30 Python
python变量不能以数字打头详解
Jul 06 Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
Jun 15 Python
python面向对象多线程爬虫爬取搜狐页面的实例代码
May 31 Python
python实现kmp算法的实例代码
Apr 03 Python
pybind11在Windows下的使用教程
Jul 04 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
Jul 24 Python
详解Django CAS 解决方案
Oct 30 Python
Python3.7 读取 mp3 音频文件生成波形图效果
Nov 05 Python
Python Django中间件使用原理及流程分析
Jun 13 Python
利用Python网络爬虫爬取各大音乐评论的代码
Apr 13 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
Drupal7中常用的数据库操作实例
2014/03/02 PHP
ThinkPHP中RBAC类的四种用法分析
2014/11/24 PHP
PHP中error_reporting()用法详解
2015/08/31 PHP
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
2016/10/26 PHP
PHP中仿制 ecshop验证码实例
2017/01/06 PHP
用JS操作FRAME中的IFRAME及其内容的实现代码
2008/07/26 Javascript
用Javascript实现锚点(Anchor)间平滑跳转
2009/09/08 Javascript
Ext对基本类型的扩展 ext,extjs,format
2010/12/25 Javascript
查找Oracle高消耗语句的方法
2014/03/22 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
node.js中的forEach()是同步还是异步呢
2015/01/29 Javascript
AngularJs 弹出模态框(model)
2016/04/07 Javascript
js添加绑定事件的方法
2016/05/15 Javascript
js面向对象实现canvas制作彩虹球喷枪效果
2016/09/24 Javascript
Vue中rem与postcss-pxtorem的应用详解
2019/11/20 Javascript
vue.js+ElementUI实现进度条提示密码强度效果
2020/01/18 Javascript
[02:12]2019完美世界全国高校联赛(春季赛)报名开启
2019/03/01 DOTA
使用beaker让Facebook的Bottle框架支持session功能
2015/04/23 Python
python实现简单购物商城
2016/05/21 Python
利用python爬取软考试题之ip自动代理
2017/03/28 Python
在python3环境下的Django中使用MySQL数据库的实例
2017/08/29 Python
Python的地形三维可视化Matplotlib和gdal使用实例
2017/12/09 Python
python实现用户管理系统
2018/01/10 Python
使用python实现unix2dos和dos2unix命令的例子
2019/08/13 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
2020/04/01 Python
BONIA官方网站:国际奢侈品牌和皮革专家
2016/11/27 全球购物
美国顶级防滑鞋:Shoes For Crews
2017/03/27 全球购物
ManoMano英国:欧洲第一家专注于DIY和园艺市场的电商平台
2020/03/12 全球购物
公积金单位接收函
2014/01/11 职场文书
小学生读书笔记
2015/07/01 职场文书
劳动合同变更协议书范本
2019/04/18 职场文书
工作简历的自我评价
2019/05/16 职场文书
基于Python绘制子图及子图刻度的变换等的问题
2021/05/23 Python
Python编程源码报错解决方法总结经验分享
2021/10/05 Python
详解nginx安装过程并代理下载服务器文件
2022/02/12 Servers
Java练习之潜艇小游戏的实现
2022/03/16 Java/Android