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

我们再访问该服务 , 其返回如下:

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

文章插图
 
通过上述改造我们就实现了多线程的web服务器 , 了解了web服务的基本实现 , 下面我们就来看看WSGI的具体实现 。
03 WSGI Application实现在了解了基本的web服务的实现 , 我们看WSGI协议 , WSGI协议分为两部分 , 一部分是web server或者网关就是上面web server代码一样 , 它监听在某个端口上接受外部的请求 , 另外一部分就是web应用 , web server将接受到的请求数据通过WSGI协议规定的方式把数据传递给web应用 , web应用处理完数据后设置对应的状态码与header然后返回 , web server拿到返回数据之后再进行HTTP协议封装然后返回给客户端 , 下面我们看看WSGI协议通过代码的具体实现
1. #!/usr/bin/env/ python  2. # -*- coding:utf-8 -*-  3.   4. import os  5. import sys  6.   7.   8. def _app(environ, response):  9.     status = "200 OK"  10.     resp_hearders = [('Content-Type', 'text/html')]  11.     response(status, resp_hearders)  12.     return [b'<h1>simple wsgi app</h1>n']  13.   14. def _to_bytes(content):  15.     return content.encode()  16.   17. def run_with_cgi(application):  18.     environ = dict(os.environ.items())  19.     environ['wsgi.input'] = sys.stdin.buffer  20.     environ['wsgi.errors'] = sys.stderr  21.     environ['wsgi.version'] = (1, 0)  22.     environ['wsgi.multithread'] = False  23.     environ['wsgi.multiprocess'] = True  24.     environ['wsgi.run_once'] = True  25.   26.     if environ.get('HTTPS', 'off') in ('on', '1'):  27.         environ['wsgi.url_scheme'] = 'https'  28.     else:  29.         environ['wsgi.url_scheme'] = 'http'  30.   31.     headers_set = []  32.     headers_sent = []  33.   34.     def write(data):  35.         out = sys.stdout.buffer  36.   37.         if not headers_set:  38.             raise ValueError("write before response()")  39.   40.         elif not headers_sent:  41.             # 输出数据前, 先发送响应头  42.             status, response_headers = headers_sent[:] = headers_set  43.             out.write(_to_bytes('Status: {}rn'.format(status)))  44.             for header in response_headers:  45.                 out.write(_to_bytes('{}: {}rn'.format(header, header)))  46.             out.write(_to_bytes('rn'))  47.   48.         out.write(data)  49.         out.flush()  50.   51.     def response(status, response_headers, error_info=None):  52.         if error_info:  53.             try:  54.                 if headers_sent:  55.                     # 已经发送header就抛出异常  56.                     raise (error_info[0], error_info[1], error_info[2])  57.   58.             finally:  59.                 error_info = None  60.   61.         elif headers_set:  62.             raise ValueError("Headers already set")  63.   64.         headers_set[:] = [status, response_headers]  65.         return write  66.   67.     result = application(environ, response)  68.   69.     try:  70.         for data in result:  71.             # 没有body数据则不发送header  72.             if data:  73.                 write(data)  74.         if not headers_sent:  75.             write('')  76.   77.     finally:  78.         if hasattr(result, 'close'):  79.             result.clost()  80.   81. if __name__ == "__main__":  82.     run_with_cgi(_app)  


推荐阅读