web服务器与wsgi协议引入,第二十三节 让web服务器支持WSGI协议

importsocketimportmultiprocessingimportreimportdynamic.mini_frameclassWSGIServer():def __init__(self):

self.web_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

self.web_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)

self.web_socket.bind((‘192.168.0.106‘,7890))

self.web_socket.listen(128)deftcp_serve(self, resp_socket):

recv_data= resp_socket.recv(1024).decode(‘utf-8‘)

request_lines=recv_data.splitlines()

file_name= ‘‘ret= re.match(r"[^/]+(/[^ ]*)",request_lines[0])ifret:

file_name=ret.group(1)print(file_name)if file_name == "/":

file_name= ‘\index.html‘path= r‘E:\\360Downloads\\Software\\新建文件夹\\新建文件夹\\tmag_23_Infinity‘+file_nameif not file_name.endswith(".py"):#判断是都是.py结尾,不是返回动态页面,是返回静态页面

try:

f=open(path,‘rb‘)except:

resp_data= ‘HTTP/1.1 200 OK\r\n‘ + "\r\n" + ‘.....file not find....‘resp_socket.send(resp_data.encode(‘utf-8‘))else:

html_content=f.read()

f.close()

resp_data= ‘HTTP/1.1 200 OK\r\n‘ + "\r\n"resp_socket.send(resp_data.encode(‘utf-8‘))

resp_socket.send(html_content)else:#动态页面处理

env=dict()

env[‘PATH INFO‘] =file_name#调用mini_frame框架里的application函数,返回header和body,在将两者在web服务器里组装,返回给浏览器

body =dynamic.mini_frame.application(env, self.set_response_headers)

header= ‘HTTP/1.1 %s\r\n‘ %self.statusfor temp inself.headers:

header+= "%s:%s\r\n" % (temp[0], temp[1])

header+= "\r\n"resp_data= header +body

resp_socket.send(resp_data.encode(‘utf-8‘))

resp_socket.close()defset_response_headers(self,status,headers):‘‘‘该方法用于接收mini_frame框架里返回的header数据‘‘‘self.status=status

self.headers= [(‘Server‘,‘mini_web v8.8‘)]

self.headers+=headersdefrun_forver(self):whileTrue:

resp_socket, resp_addr=self.web_socket.accept()

p= multiprocessing.Process(target=self.tcp_serve, args=(resp_socket,))

p.start()#同乌班图一样也需要关闭套接字,跟文件描述符有关,不然页面一直刷新不出来

resp_socket.close()#self.web_socket.close()

defmain():

wsgi_server=WSGIServer()

wsgi_server.run_forver()if __name__ == ‘__main__‘:

main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值