写一个Python 1、通过select实现的最简单的web框架2、通过wsgiref实现的web框架

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 
 4 import socket
 5 import select
 6 
 7 
 8 class MyRequest:
 9     """
10     从请求头请求体获取的信息封装的request对象中
11     """
12     def __init__(self,data):
13         header_body=data.decode('utf-8')
14         header_str,body_str=header_body.split('\r\n\r\n')
15         header_list=header_str.split('\r\n')
16         method,url,protocal=header_list[0].split(' ')
17 
18         header_dict={}
19 
20         for i in range(1,len(header_list)):
21             k,v =header_list[i].split(':',1)
22             header_dict[k]=v
23 
24         self.method=method
25         self.url=url
26         self.headers=header_dict
27 
28 
29 class MyResponse:
30     """
31     处理服务端要返回给浏览器的数据,相当于HTTPResponse或render
32     """
33     def __init__(self,data):
34         self.data=data
35         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>'
36     def myrender(self):
37         return self.base_data.format(self.data).encode('utf-8')
38 
39 
40 #  下面2个简单的视图函数
41 def index(request):
42     return MyResponse('index page').myrender()
43 
44 def login(request):
45     return MyResponse('login page').myrender()
46 
47 
48 #  路由系统
49 routers=[
50     ['/index',index],
51     ['/login',login],
52 ]
53 
54 
55 sk=socket.socket()
56 sk.setblocking(False)
57 sk.bind(('127.0.0.1',8080))
58 sk.listen(5)
59 
60 inputs=[sk,]   #  套接字接听对象,是socket或conn的一个或多个
61 
62 while True:
63     rList,wList,eList=select.select(inputs,[],[],2)
64     #  读,写,错误  3个列表
65     for server in rList:
66         if server==sk:
67             conn,addr=sk.accept()
68             inputs.append(conn)
69         else:
70             header_body_bytes=server.recv(8096)
71             request=MyRequest(header_body_bytes)
72             view_method=None
73             for view_function in routers:
74                 #  根据请求url通过路由交给不同的视乎函数处理
75                 if request.url == view_function[0]:
76                     view_method=view_function[1]
77                     break
78             if not view_method:
79                 response=MyResponse('404').myrender()
80             else:
81                 response=view_method(request)
82             server.sendall(response)
83             inputs.remove(server)
84             server.close()

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from wsgiref.simple_server import make_server

#  下面2个视图函数
def indexfunc(request):
    f=open(r'templates/index.html','rb')
    data=f.read()
    f.close()
    print('执行了indexfunc')
    return [data]

def loginfunc(request):
    request_method=request.get('REQUEST_METHOD')
    if request_method=='GET':
        f = open(r'templates/login.html', 'rb')
        data = f.read()
        f.close()
        print('执行了login')
        return [data]

#  路由
routers=[
    ('/index',indexfunc),
    ('/login',loginfunc),
         ]

drouters=dict(routers)


def application(environ,start_response):
    start_response('200 ok',[('Content-Type','text/html')])
    path=environ.get('PATH_INFO')
    print(path)
    if drouters.get(path):
        print('yeah')
        return drouters.get(path)(environ)
    else:

        return [b'<h1>404<h1>']

t=make_server('127.0.0.1',8989,application)
t.serve_forever()

  

posted @ 2017-12-12 11:48  ALXPS  阅读(192)  评论(0编辑  收藏  举报