- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
-
- import socket
- import select
-
-
- class MyRequest:
- """
- 从请求头请求体获取的信息封装的request对象中
- """
- def __init__(self,data):
- header_body=data.decode(‘utf-8‘)
- header_str,body_str=header_body.split(‘\r\n\r\n‘)
- header_list=header_str.split(‘\r\n‘)
- method,url,protocal=header_list[0].split(‘ ‘)
-
- header_dict={}
-
- for i in range(1,len(header_list)):
- k,v =header_list[i].split(‘:‘,1)
- header_dict[k]=v
-
- self.method=method
- self.url=url
- self.headers=header_dict
-
-
- class MyResponse:
- """
- 处理服务端要返回给浏览器的数据,相当于HTTPResponse或render
- """
- def __init__(self,data):
- self.data=data
- self.base_data=‘HTTP/1.1 200 OK\r\n\r\n<html><head><meta charset="UTF-8"></head><body><h1>{0}</h1></body></html>‘
- def myrender(self):
- return self.base_data.format(self.data).encode(‘utf-8‘)
-
-
- # 下面2个简单的视图函数
- def index(request):
- return MyResponse(‘index page‘).myrender()
-
- def login(request):
- return MyResponse(‘login page‘).myrender()
-
-
- # 路由系统
- routers=[
- [‘/index‘,index],
- [‘/login‘,login],
- ]
-
-
- sk=socket.socket()
- sk.setblocking(False)
- sk.bind((‘127.0.0.1‘,8080))
- sk.listen(5)
-
- inputs=[sk,] # 套接字接听对象,是socket或conn的一个或多个
-
- while True:
- rList,wList,eList=select.select(inputs,[],[],2)
- # 读,写,错误 3个列表
- for server in rList:
- if server==sk:
- conn,addr=sk.accept()
- inputs.append(conn)
- else:
- header_body_bytes=server.recv(8096)
- request=MyRequest(header_body_bytes)
- view_method=None
- for view_function in routers:
- # 根据请求url通过路由交给不同的视乎函数处理
- if request.url == view_function[0]:
- view_method=view_function[1]
- break
- if not view_method:
- response=MyResponse(‘404‘).myrender()
- else:
- response=view_method(request)
- server.sendall(response)
- inputs.remove(server)
- server.close()