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 'Hello, web!
' 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 urlpatterns19 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 = None25 for item in urlpatterns:26 if item[0] == url:27 func = item[1]28 break29 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 2 3 4 56 7 8 Index
9 10 11 12 13 index.html
1 2 3 4 513 14 15 16 login.html6 7 8
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 data12 13 14 def login():15 # return 'login'16 f = open('login.html')17 data = f.read()18 return data19 20 21 def routers():22 23 urlpatterns = (24 ('/index/', index),25 ('/login/', login),26 )27 28 return urlpatterns29 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 = None36 for item in urlpatterns:37 if item[0] == url:38 func = item[1]39 break40 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框架。