解析Python
BaseHTTPServer
1.概述
某项目的性能测试工作,已经接近尾声,借此机会进行一下总结。
这项工作,对我这种编码白痴和技术菜鸟来讲,最大的收获莫过于完成工作的同时,入门了一点点python编程和BaseHTTPServer库的使用。
2.
BaseHTTPServer
BaseHTTPServer库是一个非常简单并且容易上手的python基础库。基于该库,用户可以完成很多有用的小工具。
BaseHTTPServer库中主要包含两个类:HTTPServer和BaseHTTPRequestHandler。前者继承SocketServer.TCPServer,主要用于监听用户请求,并把请求转发给应答处理模块。BaseHTTPRequestHandler就是应答处理模块,该类继承SocketServer.StreamRequestHandler,主要对HTTP请求作出应答。BaseHTTPRequestHandler本身无法响应具体的HTTP请求,必须被继承来处理对应的HTTP请求。
3. 程序框架
# 导入对应模块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")
#定义处理http
delet方法的逻辑def do_DELETE(self):
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()
3. 程序实例
源代码
from
BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
SERVER_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()
运行结果
4. 关于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()