Python BaseHTTPServer

原新浪博客(http://blog.sina.com.cn/billsona)搬迁至此。


前言

某项目的性能测试工作,已经接近尾声,借此机会进行一下总结。
这项工作,对我这种编码白痴和技术菜鸟来讲,最大的收获莫过于完成工作的同时,入门了一点点python编程和BaseHTTPServer库的使用。


一、BaseHTTPServer

BaseHTTPServer库是一个非常简单并且容易上手的python基础库。基于该库,用户可以完成很多有用的小工具。

BaseHTTPServer库中主要包含两个类:HTTPServer和BaseHTTPRequestHandler。前者继承SocketServer.TCPServer,主要用于监听用户请求,并把请求转发给应答处理模块。BaseHTTPRequestHandler就是应答处理模块,该类继承SocketServer.StreamRequestHandler,主要对HTTP请求作出应答。BaseHTTPRequestHandler本身无法响应具体的HTTP请求,必须被继承来处理对应的HTTP请求。

二、程序框架

# 导入对应模块
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

# #定义HTTP Server的IP和端口号
SERVER_IP = '10.64.20.52'
PORT_NUMBER = 80


# 创建继承于BaseHTTPRequestHandler的自定义类,用来处理对应的HTTP请求
class myHttpRequestHandler(BaseHTTPRequestHandler):
    # 定义处理http get方法的逻辑
    def do_GET(self):
        # http请求头的处理示例,可以通过http请求头获得一些需要的信息
        content_length = int(self.headers.getheader('content-length'))
        # 根据需要设计自己的http处理逻辑
        content = "xxxxx"
        result_code = 200
        # 将构造的http响应消息返回给对应的http client
        self.send_response(result_code)
        self.end_headers()
        self.wfile.write(content)
        return

    # 同http get的处理一样,定义处理http post方法的逻辑,可以引入对应的异常处理机制
    def do_POST(self):
        try:
            print "do some thing"
        except IOError:
            self.send_error(result_code, "error message")

    try:
        # 启动HTTP Server监听对应的端口
        server = HTTPServer((SERVER_IP, PORT_NUMBER), myHttpRequestHandler)
        print 'Httpserver on port ', PORT_NUMBER, ' has been started.'
        server.serve_forever()
    except KeyboardInterrupt:
        # 根据条件关闭http server
        print '^C received, web server has been shutdown.'
        server.socket.close()

三、程序实例

源代码

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServerSERVER_
IP = '10.64.20.52'
PORT_NUMBER = 80

class myHttpRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        sendReply = False
        try:
            if self.path.find("plus") >= 0:
                content = "You want to do plus"
                result_code = 200
                sendReply = True
            if self.path.find("sub") >= 0:
                content = "You want to do sub"
                result_code = 200
                sendReply = True
            if sendReply == True:
                print 'your http response content is: ', content
                print 'your http response code is: ', result_code
                self.send_response(result_code)
                self.end_headers()
                self.wfile.write(content)
                return
        except IOError:
            self.send_error(result_code, "EEROR: your request is error!!" + self.path)
    def do_POST(self):
        # get content length of post request.
        content_length =int(self.headers.getheader('content-length'))
        #get the whole content of post request
        postvars =self.rfile.read(content_length)
        sendReply =False
        try:
            #feedback the whole content of the post request.
            content = postvars
            result_code = 200
            sendReply =True
            ###-----Doing respons to the request.
            print'your http response content is: ', content
            print 'your http response code is: ', result_code
            self.send_response(result_code)
            self.end_headers()
            self.wfile.write(content)
            return
        except IOError:
            self.send_error(result_code, "EEROR: your request is error!!"+ self.path)
        try:
            server = HTTPServer((SERVER_IP, PORT_NUMBER), myHttpRequestHandler)
            print 'Started httpserver on port ', PORT_NUMBER
            server.serve_forever()
        except KeyboardInterrupt:
            print '^C received, shutting down the web server'
            server.socket.close()

运行结果
在这里插入图片描述

四、关于https的处理

BaseHTTPServer也可以处理https的请求,只要加入对应的证书即可。

源代码

httpd = BaseHTTPServer.HTTPServer(('10.64.20.52', 443), MyHttpHandler)
httpd.socket = ssl.wrap_socket(httpd.socket, certfile='./server.pem', server_side=True)
httpd.serve_forever()

猜你喜欢

转载自blog.csdn.net/lipeixinglive/article/details/113700443
今日推荐