Web框架的本质
Web服务端的本质就是一个socket服务端,而我们的浏览器就是socket客户端。浏览器发送的请求就是一次socket请求。一次请求获得一次响应,然后就断开,这是一个短连接。
import socket def hand_request(conn): #建立接收端 data = conn.recv(1024) conn.send('HTTP/1.1 200 OK '.encode('utf-8')) #这里是浏览器解释的内容,先不用知道 conn.send("<h1>hello word!</h1>".encode('utf-8')) def main(): #建立发送端 server = socket.socket() server.bind(("localhost",8000)) server.listen(5) #持续监听 while True: conn,addr = server.accept() hand_request(conn) conn.close() if __name__ == "__main__": main()
然后打开本机的浏览器访问我们的Web服务。在地址栏输入 http://127.0.0.1:8000/ 或 http://localhost:8000/ 之后,浏览器上就会显示服务端返回的内容了。
上述通过socket来实现了其本质,而对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序。服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理。应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务
WSGI
WSGI(Web Server Gateway Interface),是一种规范。它定义了使用python编写的web app与web server,实现web app与web server间的解耦。其实就是封装了一个socket。
python标准库提供的独立WSGI服务的模块称为wsgiref。
# !/usr/bin/env python # _*_coding:utf-8_*_ from wsgiref.simple_server import make_server def RunServer(environ, start_response): # environ:封装了客户端发来的所有的数据 # start_response:封装了要返回给用户的数据,响应头和响应状态 start_response('200 OK', [('Content-Type', 'text/html')]) # 返回给客户端的内容,用return返回。记得要转成bytes类型 return ['<h1>Hello, web!</h1>'.encode('utf-8'), ] if __name__ == '__main__': httpd = make_server('', 8000, RunServer) # 创建服务,不需要我们自己创建socket服务了 print("Serving HTTP on port 8000...") httpd.serve_forever() # 运行服务
响应不同的url请求
通常我们的请求可能要访问的是网站中的某个页面,比如是这样的形式 http://localhost:8000/data 。这需要在服务端能够区别出不同的请求,然后给客户端返回不同的内容。
environ,封装了客户端发来的所有的数据,现在来找一下请求的数据具体在哪里。
在上面例子中的 RunServer 函数中添加断点,然后Debug模式启动。此时再用上面的url发起请求。
展开 environ 后,可以找到 PATH_INFO 内存放的就是 '/data' ,也就是我们请求的页面。在函数内判断一下 environ['PATH_INFO'] 的值,就可以在里面自定义自己的web框架
自定义Web框架
自己写一个web框架
from wsgiref.simple_server import make_server def index(): return 'index' def login(): return 'login' def home(): return 'home' def routers(): urlpatterns = ( ('/index',index) ('/login',login) ('/home',home) ) return urlpatterns def RunServer(environ, start_response): # 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) # 创建服务,不需要我们自己创建socket服务了 print("Serving HTTP on port 8000...") httpd.serve_forever() # 运行服务
Web框架
MVC框架
web_server.py
├─Model
│ └─get_data.py
├─View
│ └─index.html
└─Contraller
└─account.py
MVC(Model View Controller 模型-视图-控制器)的Web架构
MTV框架
另外还有一种,MTV(Model Templates View 模型-模板-视图)。也就是把MVC中的View分成了视图(展现哪些数据)和模板(如何展现)2个部分,而Contorller这个要素由框架自己来实现了,我们需要做的就是把(带正则表达式的)URL对应到视图就可以了,通过这样的URL配置,系统将一个请求发送到一个合适的视图。 Django就是基于这个框架写的