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 爬虫的工具列表大全
Jan 31 Python
Python模块包中__init__.py文件功能分析
Jun 14 Python
Python中的左斜杠、右斜杠(正斜杠和反斜杠)
Aug 30 Python
用python处理图片之打开\显示\保存图像的方法
May 04 Python
Python处理中文标点符号大集合
May 14 Python
Tensorflow卷积神经网络实例
May 24 Python
django将图片上传数据库后在前端显式的方法
May 25 Python
python 利用栈和队列模拟递归的过程
May 29 Python
详解python 3.6 安装json 模块(simplejson)
Apr 02 Python
flask利用flask-wtf验证上传的文件的方法
Jan 17 Python
Django获取model中的字段名和字段的verbose_name方式
May 19 Python
python golang中grpc 使用示例代码详解
Jun 03 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
php 将bmp图片转为jpg等其他任意格式的图片
2009/06/21 PHP
form表单传递数组数据、php脚本接收的实例
2017/02/09 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
jquery 框架使用教程 AJAX篇
2009/10/11 Javascript
js简单实现删除记录时的提示效果
2013/12/05 Javascript
详解AngularJS中module模块的导入导出
2015/12/10 Javascript
基于JavaScript获取鼠标位置的各种方法
2015/12/16 Javascript
javascript实现网站加入收藏功能
2015/12/16 Javascript
JS控制伪元素的方法汇总
2016/04/06 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
防止Node.js中错误导致进程阻塞的办法
2016/08/11 Javascript
js 用于检测类数组对象的函数方法
2017/05/02 Javascript
了解VUE的render函数的使用
2017/06/08 Javascript
详解使用angular的HttpClient搭配rxjs
2017/09/01 Javascript
如何用input标签和jquery实现多图片的上传和回显功能
2018/05/16 jQuery
Bootstrap的aria-label和aria-labelledby属性实例详解
2018/11/02 Javascript
vue.js 2.*项目环境搭建、运行、打包发布的详细步骤
2019/05/01 Javascript
React 条件渲染最佳实践小结(7种)
2020/09/27 Javascript
在vue中使用vant TreeSelect分类选择组件操作
2020/11/02 Javascript
[01:10]DOTA2次级职业联赛 - Fly战队宣传片
2014/12/01 DOTA
[01:46]辉夜杯—打造中国DOTA新格局
2015/12/25 DOTA
pymongo给mongodb创建索引的简单实现方法
2015/05/06 Python
python与C互相调用的方法详解
2017/07/14 Python
微信跳一跳游戏python脚本
2020/04/01 Python
python斐波那契数列的计算方法
2018/09/27 Python
django的ORM模型的实现原理
2019/03/04 Python
Python操作MySQL数据库的示例代码
2020/07/13 Python
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
探亲假请假条
2014/04/11 职场文书
护理学专业求职信
2014/06/29 职场文书
超市店庆活动方案
2014/08/31 职场文书
2015年端午节活动总结
2015/02/11 职场文书
导盲犬小Q观后感
2015/06/11 职场文书
使用 JavaScript 制作页面效果
2021/04/21 Javascript
Spring Boot两种全局配置和两种注解的操作方法
2021/06/29 Java/Android
浅谈为什么我的 z-index 又不生效了
2022/07/15 HTML / CSS