首页 > Python > Python的http服务(SimpleHTTPServer,BaseHTTPServer,CGIHTTPServer)
2016
09-20

Python的http服务(SimpleHTTPServer,BaseHTTPServer,CGIHTTPServer)

 Python的“Web服务器模块”有如下三种

一、SimpleHTTPServer:包含执行GET和HEAD请求的SimpleHTTPRequestHandler类
通过下面命令我们创建了HTTP服务,默认使用8000端口号监听。通过:http://localhost:8000/ 就可以访问,如果文件夹下有index.html,那么这个文件就会成为一个默认页,如果没有这个文件,那么,目录列表就会显示出来。

python -m SimpleHTTPServer

python -m SimpleHTTPServer 8080 #指定端口号

二、BaseHTTPServer,提供基本的Web服务和处理器类,分别是HTTPServer和BaseHTTPRequestHandler。
主要代码(完整代码参考附件下载):
启动一个8000监听的httpserver,由MyRequestHandler处理请求。

server = HTTPServer(('', 8000), MyRequestHandler)
print 'started httpserver...'
server.serve_forever()

 MyRequestHandler类:

class MyRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.process(2)
 
    def do_POST(self):
        self.process(1)
 
    def process(self,type):
 
        content =""
        if type==1:#post方法,接收post参数
            datas = self.rfile.read(int(self.headers['content-length']))
            datas = urllib.unquote(datas).decode("utf-8", 'ignore')#指定编码方式
            datas = transDicts(datas)#将参数转换为字典
            if datas.has_key('data'):
                content = "data:"+datas['data']+"\r\n"
 
        if '?' in self.path:
            query = urllib.splitquery(self.path)
            action = query[0]
 
            if query[1]:#接收get参数
                queryParams = {}
                for qp in query[1].split('&'):
                    kv = qp.split('=')
                    queryParams[kv[0]] = urllib.unquote(kv[1]).decode("utf-8", 'ignore')
                    content+= kv[0]+':'+queryParams[kv[0]]+"\r\n"
 
            #指定返回编码
            enc="UTF-8"
            content = content.encode(enc)
            f = io.BytesIO()
            f.write(content)
            f.seek(0)
            self.send_response(200)
            self.send_header("Content-type", "text/html; charset=%s" % enc)
            self.send_header("Content-Length", str(len(content)))
            self.end_headers()
            shutil.copyfileobj(f,self.wfile)

说明:
1、get测试:http://steven-pc:8000/?test=data
2、通过curl来测试post数据:
curl -d "data=postdata" http://steven-pc:8000?test=post
data:postdata
test:post
3、支持中文:必须在头部加:#encoding=utf-8

三、CGIHTTPServer: 包含处理POST请求和执行CGIHTTPRequestHandler类。
参考 CGI介绍及使用Python来开发CGI应用示例
四、资源下载
BaseHTTPServer DEMO:

#encoding=utf-8
'''
基于BaseHTTPServer的http server实现,包括get,post方法,get参数接收,post参数接收。
'''
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import io,shutil  
import urllib,time
import getopt,string
class MyRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.process(2)
    def do_POST(self):
        self.process(1)
        
    def process(self,type):
        
        content =""
        if type==1:#post方法,接收post参数
            datas = self.rfile.read(int(self.headers['content-length']))
            datas = urllib.unquote(datas).decode("utf-8", 'ignore')#指定编码方式
            datas = transDicts(datas)#将参数转换为字典
            if datas.has_key('data'):
                content = "data:"+datas['data']+"\r\n"
                
        if '?' in self.path:
            query = urllib.splitquery(self.path)
            action = query[0] 
                     
            if query[1]:#接收get参数
                queryParams = {}
                for qp in query[1].split('&'):
                    kv = qp.split('=')
                    queryParams[kv[0]] = urllib.unquote(kv[1]).decode("utf-8", 'ignore')
                    content+= kv[0]+':'+queryParams[kv[0]]+"\r\n"
                    
            #指定返回编码
            enc="UTF-8"  
            content = content.encode(enc)          
            f = io.BytesIO()  
            f.write(content)  
            f.seek(0)  
            self.send_response(200)  
            self.send_header("Content-type", "text/html; charset=%s" % enc)  
            self.send_header("Content-Length", str(len(content)))  
            self.end_headers()  
            shutil.copyfileobj(f,self.wfile)  
def transDicts(params):
    dicts={}
    if len(params)==0:
        return
    params = params.split('&')
    for param in params:
        dicts[param.split('=')[0]]=param.split('=')[1]
    return dicts
       
if __name__=='__main__':
    
    try:
        server = HTTPServer(('', 8000), MyRequestHandler)
        print 'started httpserver...'
        server.serve_forever()
    except KeyboardInterrupt:
        server.socket.close()
    
    pass

 

作者:admin
admin
TTF的家园-www.ttfde.top 个人博客以便写写东西,欢迎喜欢互联网的朋友一起交流!

本文》有 0 条评论

留下一个回复