码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-12-12 13:31:12      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:dal   bin   not   blog   one   bytes   获取   pos   method   

 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()

 

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

标签:dal   bin   not   blog   one   bytes   获取   pos   method   

原文地址:http://www.cnblogs.com/ALXPS/p/8027067.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!