一文秒懂Web框架基础之WSGI协议

本篇文章我们主要介绍WSGI协议 , 该协议用来描述Server与Framework之间的通信接口 , 我们日常使用的Python WEB框架Django、Flask、web.py等都遵循了该协议 。下面我们就来详细了解一下该协议的实现吧!
01 简介WSGI协议全称Web Server Gateway Interface(Web服务器网关接口) 。这是Python中定义的一个网关协议 , 规定了Web Server如何跟应用程序交互 。该协议的主要目的就是在Python中所有Web Server程序或者网关程序 , 能够通过统一的协议跟Web框架或者Web应用进行交互 。如果没有这个协议 , 那每个程序都要各自实现各自的交互接口 , 而不能够互相兼容 , 重复造轮子 。使用统一的协议 , Web应用框架只要实现WSGI协议规范就可以与外部进行交互 , 不用针对某个Web Server独立开发交互逻辑 。
02 Web Server实现在了解WSGI协议之前 , 我们先通过socket实现一个Web服务器 。通过监听本地端口来接客户端的web请求 , 然后进行响应 , 具体如下:
1. #!/usr/bin/env/ python  2. # -*- coding:utf-8 -*-  3.   4. import socket  5.   6. END_TAG_F = b'nn'  7. END_TAG_S = b'nrn'  8.   9. # 设置web server响应内容  10. html_content = '<html><h1>My Frist Web Page<h1></html>'  11.   12. # 设置响应headers  13. resp_args = ['HTTP/1.0 200 OK', 'Date: Sun, 22 nov 2020 19:00:00 GMT',  14.              'Content-Type: text/html;charset=utf-8',  15.              'Content-Length: {}rn'.format(len(html_content)), html_content]  16.   17. _resp = "rn".join(resp_args)  18.   19.   20. def connet_operate(conn, addr):  21.     """ 22.     请求操作 23.     :param conn:  24.     :param addr:  25.     :return:  26.     """  27.     request = b''  28.     while END_TAG_F not in request and END_TAG_S not in request:  29.         request += conn.recv(1024)  30.   31.     print("请求内容: ", request)  32.     conn.send(_resp.encode())  33.     conn.close()  34.   35.   36. def web_server():  37.     # socket.AF_INET用于服务器与服务器之间同行   38.     # socket.SOCK_STREAM用于基于TCP流的通信  39.     server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  40.       41.     # 监听本地8888端口  42.     server.bind(('127.0.0.1', 8888))  43.     server.listen()  44.     print("web server已经启动")  45.   46.     try:  47.         while True:  48.             conn, address = server.accept()  49.             connet_operate(conn, address)  50.     except:  51.         server.close()  52.   53.   54. if __name__ == "__main__":  55.     web_server()  下面我们启动server服务器 , 查看页面能不能正常访问 , 同时看看

一文秒懂Web框架基础之WSGI协议

文章插图
 

一文秒懂Web框架基础之WSGI协议

文章插图
 
上面代码就是最基本的web服务模型了 , 通过socket与HTTP协议提供Web服务 , 但上面的web服务是单线程的 , 只有前一个请求处理结束才处理第二个请求 , 我们该造一下上面的代码 , 通过python threading模块实现多线程的web服务器 , 具体操作如下:


推荐阅读