Python BaseHTTPServer 模块解析

#-*- encoding:utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

# @explain: 实现GET方法和POST方法请求

from  BaseHTTPServer import HTTPServer,BaseHTTPRequestHandler
import urllib

class ServerHTTP(BaseHTTPRequestHandler):
    def do_GET(self):#针对GET请求方式的应答函数
        print"----------------------------------GET----------------------------------"
        path = self.path#127.0.0.1:8000/wahaha提取出路径的后面部分
        print path
        #拆分url(也可根据拆分的url获取Get提交才数据),可以将不同的path和参数加载不同的html页面,或调用不同的方法返回不同的数据,来实现简单的网站或接口
        query = urllib.splitquery(path)
        print "query=",query
        self.send_response(200)
        self.send_header("Content-type","text/html")
        self.send_header("test","This is test!")
        self.end_headers()
        buf = '''<!DOCTYPE HTML>
                <html>
                <head><title>Get page</title></head>
                <body>
                
                <form action="post_page" method="post">
                  username: <input type="text" name="username" /><br />
                  password: <input type="text" name="password" /><br />
                  <input type="submit" value="POST" />
                </form>
                
                </body>
                </html>'''
        self.wfile.write(buf)
        #GET方法对应的请求方式 curl -i 127.0.0.1:8000/wahaha
    def do_POST(self):#针对post请求方式的应答函数
        print"---------------------------------POST---------------------------------"
        path = self.path
        print path
        #获取post提交的数据
        datas = self.rfile.read(int(self.headers['content-length']))
        datas = urllib.unquote(datas).decode("utf-8", 'ignore')
        
        self.send_response(200)
        self.send_header("Content-type","text/html")
        self.send_header("test","This is test!")
        self.end_headers()
        buf = '''<!DOCTYPE HTML>
        <html>
            <head><title>Post page</title></head>
            <body>Post Data:%s  <br />Path:%s</body>
        </html>'''%(datas,self.path)
        self.wfile.write(buf)
        #curl -l -H "Content-type: application/json" -X POST -d '{"phone":"13521389587","password":"test"}'  127.0.0.1:8000/wahaha

        
def start_server(port):
    http_server = HTTPServer(('', int(port)), ServerHTTP)#HTTPServer绑定对应的应答类ServerHTTP
    http_server.serve_forever()
    
if __name__ == "__main__":
    start_server(8000)#监听端口




浏览器窗口输入:127.0.0.1:8000 + /anyurl 也可不加,加了后会打印对应的url

BaseHTTPServer:

主要包含两个类HTTPServerBaseHTTPRequestHandler

HTTPServer:
    继承SocketServer.TCPServer,用于获取请求,并将请求分配给应答程序处理

BaseHTTPRequestHandler:
    继承SocketServer.StreamRequestHandler,对http连接的请求作出应答(response)
    
基于BaseHTTPServer 的Http Server的处理流程:
1.HTTPServer绑定对应的应答类(BaseHTTPRequestHandler )
    http_server = HTTPServer(('', int(port)), ServerHTTP)
2.监听端口:
    http_server.serve_forever() 
    serve_forever()方法使用select.select()循环监听请求,当接收到请求后调用
    当监听到请求时,取出请求对象
3.应答:
    创建新线程以连接对象(开始理解成请求对象)为参数实例化应答类:ServerHTTP()
    应答类根据请求方式调用ServerHTTP.do_XXX处理方法

常用方法/属性:

BaseHTTPRequestHandler.path                    #包含的请求路径和GET请求的数据
BaseHTTPRequestHandler.command                 #请求类型GET、POST...
BaseHTTPRequestHandler.request_version         #请求的协议类型HTTP/1.0、HTTP/1.1
BaseHTTPRequestHandler.headers                 #请求的头
BaseHTTPRequestHandler.responses               #HTTP错误代码及对应错误信息的字典
BaseHTTPRequestHandler.handle()                #用于处理某一连接对象的请求,调用handle_one_request方法处理
BaseHTTPRequestHandler.handle_one_request()    #根据请求类型调用do_XXX()方法,XXX为请求类型
BaseHTTPRequestHandler.do_XXX()                #处理请求
BaseHTTPRequestHandler.send_error()            #发送并记录一个完整的错误回复到客户端,内部调用send_response()方法实现
BaseHTTPRequestHandler.send_response()         #发送一个响应头并记录已接收的请求
BaseHTTPRequestHandler.send_header()           #发送一个指定的HTTP头到输出流。 keyword 应该指定头关键字,value 指定它的值
BaseHTTPRequestHandler.end_headers()           #发送一个空白行,标识发送HTTP头部结束
BaseHTTPRequestHandler.wfile    #self.connection.makefile('rb', self.wbufsize) self.wbufsize = -1 应答的HTTP文本流对象,可写入应答信息
BaseHTTPRequestHandler.rfile    #self.connection.makefile('wb', self.rbufsize) self.rbufsize = 0  请求的HTTP文本流对象,可读取请求信息

更多属性和方法可查看模块源码
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值