热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

wsgi与web应用的骨架

1、WSGI是什么wsgi:WebServerGatewayInterface,是一种协议。用于定义Server与app之间的交互方式。wsgi把应用
1、WSGI是什么

wsgi:Web Server Gateway Interface,是一种协议。用于定义Server与app之间的交互方式。
wsgi把应用分成了3个组件:
1. web server:
主要实现:
1.socket通讯服务器端,监听端口
2.接收、解析http报文
3.读取服务器端的html文档,把读取的html文档response回浏览器,这是静态服务器,如nginx、Apache
4.调用app,返回app执行结果给浏览器。这是动态服务器,如Tomcat。
2. web app
1.一个函数或类的方法
2.遵循固定格式的入口函数_call_()、入参(environ,start_response)、返回值
3. 中间件
1.server与app中间的程序(所以叫中间件)
2.路由
3.流量控制等
在这里插入图片描述ps:
wsgi对web应用的划分太精辟了,对WebServer的理解、应用、url转应用调用等场景的理解豁然开朗。
以前只知道Tomcat,按这个概念套用,也更清楚了。

2、举个例子加深理解

# coding=utf-8import socket
import sysclass WSGIServer:def __init__(self):self.listener&#61;socket.socket()self.listener.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)self.listener.bind((&#39;0.0.0.0&#39;,8080))self.listener.listen(1)print(&#39;Serving HTTP 0.0.0.0 port 8080&#39;)self.app&#61;Noneself.headers_set&#61;Nonedef set_app(self,application):self.app&#61;application##start_response是服务器提供的函数&#xff0c;供app调用def start_response(self,status,headers):self.headers_set&#61;[status,headers]def serve_forever(self):while True:listener&#61;self.listenerclient_connection,client_address&#61;listener.accept()##socket服务器端&#xff0c;接收数据&#xff0c;是http协议的报文request&#61;client_connection.recv(1024)print(f&#39;request we received:{request}&#39;)method,path,_&#61;request.split(b&#39; &#39;,2)environ &#61; {&#39;wsgi.version&#39;: (1, 0),&#39;wsgi.url_scheme&#39;: &#39;http&#39;,&#39;wsgi.input&#39;: request,&#39;wsgi.errors&#39;: sys.stderr,&#39;wsgi.multithread&#39;: False,&#39;wsgi.multiprocess&#39;: False,&#39;wsgi.run_once&#39;: False,&#39;REQUEST_METHOD&#39;: method.decode(&#39;utf-8&#39;),&#39;PATH_INFO&#39;: path.decode(&#39;utf-8&#39;),&#39;SERVER_NAME&#39;: &#39;127.0.0.1&#39;,&#39;SERVER_PORT&#39;: &#39;8080&#39;,}##server调用app,传入environ(接收到的http报文)和start_response函数##app内执行传入的start_response函数&#xff0c;并返回结果http内容app_result&#61;self.app(environ,self.start_response)##response和app返回的内容构成整个响应的htmlresponse_status,response_headers&#61;self.headers_setresponse&#61;f&#39;HTTP/1.1 {response_status}\r\n&#39;for header in response_headers:response&#43;&#61;f&#39;{header[0]}:{header[1]}\r\n&#39;response&#43;&#61;&#39;\r\n&#39;response&#61;response.encode(&#39;utf-8&#39;)for data in app_result:response&#43;&#61;data##通过网络通讯&#xff0c;返回完整的响应httpclient_connection.sendall(response)client_connection.close()print(&#39;!!!!!!!!one request responsed!!!!!!!!&#39;)if __name__&#61;&#61;&#39;__main__&#39;:if len(sys.argv)<2:sys.exit(&#39;argv error&#39;)app_path&#61;sys.argv[1]module,app&#61;app_path.split(&#39;:&#39;)module&#61;__import__(module)app&#61;getattr(module,app)server&#61;WSGIServer()server.set_app(app)server.serve_forever()

在上边的程序了里&#xff1a;

  1. init(self)&#xff1a;定义socket通讯的服务器端&#xff0c;用来监听端口、接收数据、返回数据。
  2. serve_forever(self)&#xff1a;调用app&#xff0c;生成相应的http报文&#xff0c;在通过socket返回。
  3. 浏览器&#xff1a;接收服务器返回的http报文&#xff0c;然后渲染展示。

3、看看http请求和相应报文

对程序的部分内容加深理解。

3.1 请求报文

包括&#xff1a;请求的方法、url、客户端程序类型等。
浏览器自动生成并发送的。

GET / HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0
Accept: text/html,application/xhtml&#43;xml,application/xml;q&#61;0.9,image/webp,*/*;q&#61;0.8
Accept-Language: zh-CN,zh;q&#61;0.8,zh-TW;q&#61;0.7,zh-HK;q&#61;0.5,en-US;q&#61;0.3,en;q&#61;0.2
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age&#61;0

3.2 响应报文

注意遵守固定格式&#xff0c;响应头包括协议版本、响应编号、响应结果&#xff0c;
然后&#xff0c;与实际内容中间间隔一个空行。

HTTP/1.1 200 OKHello, World!


推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
author-avatar
Mr何冰_874
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有