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 Web框架Pylons中使用MongoDB的例子
Dec 03 Python
详解Python中__str__和__repr__方法的区别
Apr 17 Python
python使用PyGame播放Midi和Mp3文件的方法
Apr 24 Python
pymongo给mongodb创建索引的简单实现方法
May 06 Python
python创建列表并给列表赋初始值的方法
Jul 28 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
Jan 24 Python
python将txt文件读取为字典的示例
Dec 22 Python
tensorflow实现测试时读取任意指定的check point的网络参数
Jan 21 Python
Python第三方包之DingDingBot钉钉机器人
Apr 09 Python
TensorFlow中如何确定张量的形状实例
Jun 23 Python
详解Pycharm安装及Django安装配置指南
Sep 15 Python
Pandas的数据过滤实现
Jan 15 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 截取字符串 分别适合GB2312和UTF8编码情况
2009/02/12 PHP
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
2011/11/10 PHP
php中0,null,empty,空,false,字符串关系的详细介绍
2013/06/20 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
2017/02/23 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
laravel中的一些简单实用功能
2018/11/03 PHP
php抽象类和接口知识点整理总结
2019/08/02 PHP
javascript onkeydown,onkeyup,onkeypress,onclick,ondblclick
2009/02/04 Javascript
海量经典的jQuery插件集合
2010/01/12 Javascript
jquery 读取页面load get post ajax 四种方式代码写法
2011/04/02 Javascript
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
js的正则test,match,exec详细解析
2014/01/29 Javascript
javascript数组操作(创建、元素删除、数组的拷贝)
2014/04/07 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
JavaScript计算某一天是星期几的方法
2015/08/05 Javascript
Bootstrap CSS组件之大屏幕展播
2016/12/17 Javascript
微信小程序 本地存储及登录页面处理实例详解
2017/01/11 Javascript
JS+CSS实现下拉刷新/上拉加载插件
2017/03/31 Javascript
使用原生js封装的ajax实例(兼容jsonp)
2017/10/12 Javascript
vue结合Echarts实现点击高亮效果的示例
2018/03/17 Javascript
解决Layui 表单提交数据为空的问题
2018/08/15 Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
2019/05/22 Javascript
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
centos6.7安装python2.7.11的具体方法
2017/01/16 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
2018/07/11 Python
Python3自动签到 定时任务 判断节假日的实例
2018/11/13 Python
opencv+python实现均值滤波
2020/02/19 Python
Python学习之路安装pycharm的教程详解
2020/06/17 Python
C和C++经典笔试题附答案解析
2014/08/18 面试题
怎样写留学自荐信
2013/11/11 职场文书
致800米运动员广播稿
2014/02/16 职场文书
车间主任岗位职责
2015/02/03 职场文书
逃课检讨书范文
2015/05/06 职场文书
2015入党自传书范文
2015/06/26 职场文书
python库sklearn常用操作
2021/08/23 Python