在Python3.0中处理web请求4-回归WSGI

前面一直使用HTTPServer对web请求进行处理,今天突然想能不能改下,用python3提供的wsgiref进行处理,原来的程序:

from wsgiref.simple_server import make_server

def hello_world_app(env,start_response):
    start_response("200 OK",[("Content-type","text/plain;charset=utf-8")])
    return ["Hello World!!"]

if __name__ == "__main__":
    httpd=make_server('',8080,hello_world_app)
    httpd.handle_request()

 

问题并不在这个程序,异常报的是在write的时候,于是,要改的就是write,改哪里呢?

就改ServerHandler

这个类在wsgiref包里的simple_server.py模块中(Lib/wsgiref/simple_server.py)

原来的ServerHandler是:

class ServerHandler(SimpleHandler):

    server_software = software_version

    def close(self):
        try:
            self.request_handler.log_request(
                self.status.split(' ',1)[0], self.bytes_sent
            )
        finally:
            SimpleHandler.close(self)

 重写_write方法即可:

class ServerHandler(SimpleHandler):

    server_software = software_version

    def close(self):
        try:
            self.request_handler.log_request(
                self.status.split(' ',1)[0], self.bytes_sent
            )
            self.buf_data.seek(0)
            shutil.copyfileobj(self.buf_data,self.stdout)
        finally:
            SimpleHandler.close(self)

    def _write(self,data):
        if not hasattr(self,"buf_data"):
            self.buf_data=io.BytesIO()
        if type(data) is str:
            data=data.encode("UTF-8")
        self.buf_data.write(data)

 大功告成。

测试  http://localhost:8080,Hello World出来了!

 

为了方便调试,这里的编码直接写UTF-8了。各位根据自己的需要配置。。

如果需要使用多线程处理,可以用上一篇文章提到的ThreadingMixIn即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值