前面一直使用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即可。