Python之Web框架:
一. Web框架的本质:
对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。
1 #!/usr/bin/env python 2 #coding:utf-8 3 4 #web框架的基础结构,几乎所有开发者都是基于此基础结果进行扩展。 5 6 import socket 7 8 def handle_request(client): 9 buf = client.recv(1024) 10 client.send("HTTP/1.1 200 OK\r\n\r\n") 11 client.send("Hello, Seven") 12 13 def main(): 14 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 15 sock.bind(('localhost',8000)) 16 sock.listen(5) 17 18 while True: 19 connection, address = sock.accept() 20 handle_request(connection) 21 connection.close() 22 23 if __name__ == '__main__': 24 main()
二. Web框架的实现:
1. 基于WSGI规范:
WSGI(Web Server Gateway Interface)是一种规范, 其目标是在Web服务器和Web框架层之间提供一个通用的API标准,减少之间的互操作性并形成统一的调用方式。解决了现在众多框架,如:Django ,Flask, web.py等共用一个标准,Django应用比较广泛。
2. 自定义socket,代表有Tornado.
Python标准库中提供了简单的参考服务器(wsgirefs): wsgiref.simple_server.WSGIServer.
1 #!/usr/bin/env python 2 #coding:utf-8 3 4 from wsgiref.simple_server import make_server 5 6 def RunServer(environ, start_response): 7 start_response('200 OK', [('Content-Type', 'text/html')]) 8 return '<h1>Hello, web!</h1>' 9 10 if __name__ == '__main__': 11 httpd = make_server('', 8000, RunServer) 12 print "Serving HTTP on port 8000..." 13 httpd.serve_forever()
三. 自定义一个Web框架:
1. 通过python标准库提供的wsgiref模块开发一个自己的Web框架
1 #!/usr/bin/env python 2 #coding:utf-8 3 from wsgiref.simple_server import make_server 4 5 def index(): 6 return 'index' 7 8 def login(): 9 return 'login' 10 11 def routers(): 12 13 urlpatterns = ( 14 ('/index/',index), 15 ('/login/',login), 16 ) 17 18 return urlpatterns 19 20 def RunServer(environ, start_response): 21 start_response('200 OK', [('Content-Type', 'text/html')]) 22 url = environ['PATH_INFO'] 23 urlpatterns = routers() 24 func = None 25 for item in urlpatterns: 26 if item[0] == url: 27 func = item[1] 28 break 29 if func: 30 return func() 31 else: 32 return '404 not found' 33 34 if __name__ == '__main__': 35 httpd = make_server('', 8000, RunServer) 36 print "Serving HTTP on port 8000..." 37 httpd.serve_forever()
2. 在上一步骤中,对于所有的login、index均返回给用户浏览器一个简单的字符串,在现实的Web请求中一般会返回一个复杂的符合HTML规则的字符串,所以我们一般将要返回给用户的HTML写在指定文件中,然后再返回。如:
1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <h1>Index</h1> 9 10 </body> 11 </html> 12 13 index.html