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 ") 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
1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <form> 9 <input type="text" /> 10 <input type="text" /> 11 <input type="submit" /> 12 </form> 13 </body> 14 </html> 15 16 login.html
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 from wsgiref.simple_server import make_server 5 6 7 def index(): 8 # return 'index' 9 f = open('index.html') 10 data = f.read() 11 return data 12 13 14 def login(): 15 # return 'login' 16 f = open('login.html') 17 data = f.read() 18 return data 19 20 21 def routers(): 22 23 urlpatterns = ( 24 ('/index/', index), 25 ('/login/', login), 26 ) 27 28 return urlpatterns 29 30 31 def run_server(environ, start_response): 32 start_response('200 OK', [('Content-Type', 'text/html')]) 33 url = environ['PATH_INFO'] 34 urlpatterns = routers() 35 func = None 36 for item in urlpatterns: 37 if item[0] == url: 38 func = item[1] 39 break 40 if func: 41 return func() 42 else: 43 return '404 not found' 44 45 46 if __name__ == '__main__': 47 httpd = make_server('', 8000, run_server) 48 print "Serving HTTP on port 8000..." 49 httpd.serve_forever()
注: 实际生产环境中,网页很多,不可能创建多个def函数来实现,需要分类管理,这样就引出了MVC/MTV两种框架。
四. MVC/MTV框架:
1. MVC框架:
MVC是一种使用 MVC(Models Views Controllers 模型-视图-控制器)设计创建 Web 应用程序的模式:
-
- Models(模型)表示应用程序核心,操作数据库(比如数据库记录列表)。
- Views(视图)显示数据,放置HTML模板(数据库记录)。
- Controllers(控制器)处理用户请求(写入数据库记录)。
2. MTV框架:
MTV是一种使用MTV(Models Templates Views 模型-模板-视图)设计创建Web应用程序的模式:
Models: (模型)表示应用程序核心,操作数据库(比如数据库记录列表)。
Templates: (模板)主要放置HTML模板(数据库记录)。
Views: (视图)处理用户请求(写入数据库记录)。
注: Django为 MTV框架。