我们再访问该服务 , 其返回如下:
文章插图
通过上述改造我们就实现了多线程的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)
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Web端非常有用的一个文件上传插件——FilePond
- 想了解蓝牙音源解码必看文章 | SBC、AAC、aptX、LDAC 秒懂
- web交换机管理怎么管理?两种方法,轻松掌握
- webpack教程:如何从头开始设置 webpack 5
- 一文看懂USB和雷电接口规范的发展史
- 一文看懂微服务架构之注册中心Consul、Nacos
- 快速优化 Web 性能的10 个手段
- 10个对web开发人员有用的HTML文件上传技巧
- web应用防火墙是做什么的?与传统网络设备的区别
- Websocket技术选型参考