热门标签 | 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!


推荐阅读
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 标题: ... [详细]
  • 本文总结了淘淘商城项目的功能和架构,并介绍了传统架构中遇到的session共享问题及解决方法。淘淘商城是一个综合性的B2C平台,类似京东商城、天猫商城,会员可以在商城浏览商品、下订单,管理员、运营可以在平台后台管理系统中管理商品、订单、会员等。商城的架构包括后台管理系统、前台系统、会员系统、订单系统、搜索系统和单点登录系统。在传统架构中,可以采用tomcat集群解决并发量高的问题,但由于session共享的限制,集群数量有限。本文探讨了如何解决session共享的问题。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
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社区 版权所有