在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即可。

你可能感兴趣的:(Python)