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
- 本文固定链接: http://ttfde.top/index.php/post/319.html
- 转载请注明: admin 于 TTF的家园 发表
《本文》有 0 条评论