Python之Web框架

时间:2023-03-09 17:45:21
Python之Web框架

  Python之Web框架:

        

一.  Web框架的本质:

    对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。

 #!/usr/bin/env python
#coding:utf-8 #web框架的基础结构,几乎所有开发者都是基于此基础结果进行扩展。 import socket def handle_request(client):
buf = client.recv(1024)
client.send("HTTP/1.1 200 OK\r\n\r\n")
client.send("Hello, Seven") def main():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost',8000))
sock.listen(5) while True:
connection, address = sock.accept()
handle_request(connection)
connection.close() if __name__ == '__main__':
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.

 #!/usr/bin/env python
#coding:utf-8 from wsgiref.simple_server import make_server def RunServer(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return '<h1>Hello, web!</h1>' if __name__ == '__main__':
httpd = make_server('', 8000, RunServer)
print "Serving HTTP on port 8000..."
httpd.serve_forever()

三. 自定义一个Web框架:

  1. 通过python标准库提供的wsgiref模块开发一个自己的Web框架

 #!/usr/bin/env python
#coding:utf-8
from wsgiref.simple_server import make_server def index():
return 'index' def login():
return 'login' def routers(): urlpatterns = (
('/index/',index),
('/login/',login),
) return urlpatterns def RunServer(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
url = environ['PATH_INFO']
urlpatterns = routers()
func = None
for item in urlpatterns:
if item[0] == url:
func = item[1]
break
if func:
return func()
else:
return '404 not found' if __name__ == '__main__':
httpd = make_server('', 8000, RunServer)
print "Serving HTTP on port 8000..."
httpd.serve_forever()

  2. 在上一步骤中,对于所有的login、index均返回给用户浏览器一个简单的字符串,在现实的Web请求中一般会返回一个复杂的符合HTML规则的字符串,所以我们一般将要返回给用户的HTML写在指定文件中,然后再返回。如:

 <!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>Index</h1> </body>
</html> index.html

index

 <!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form>
<input type="text" />
<input type="text" />
<input type="submit" />
</form>
</body>
</html> login.html

login

 #!/usr/bin/env python
# -*- coding:utf-8 -*- from wsgiref.simple_server import make_server def index():
# return 'index'
f = open('index.html')
data = f.read()
return data def login():
# return 'login'
f = open('login.html')
data = f.read()
return data def routers(): urlpatterns = (
('/index/', index),
('/login/', login),
) return urlpatterns def run_server(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
url = environ['PATH_INFO']
urlpatterns = routers()
func = None
for item in urlpatterns:
if item[0] == url:
func = item[1]
break
if func:
return func()
else:
return '404 not found' if __name__ == '__main__':
httpd = make_server('', 8000, run_server)
print "Serving HTTP on port 8000..."
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框架。