外贸网站模板 免费,建设搜索引擎友好的网站,厂里拿货开小加工厂,制作软件的公司叫什么用户到我们web应用中间经过的相关协议#xff0c;具体介绍和pyhton相关的WSGI和ASGI#xff0c;我先把结论列出来#xff0c;详细描述请看下面介绍#xff01;
请大家先记住这张图#xff0c;带着问题和整个框架去看比较易于了解
CGI#xff0c;WSGI#xff0c;ASGI、…用户到我们web应用中间经过的相关协议具体介绍和pyhton相关的WSGI和ASGI我先把结论列出来详细描述请看下面介绍
请大家先记住这张图带着问题和整个框架去看比较易于了解
CGIWSGIASGI、框架以及Web服务器的关系比如flask这是一个同步框架同时也是一个Web应用一个请求需要经过Web服务器和WSGI服务器才能和框架“交流”数据。下面请看一张图来澄清整个链路
对这张图有一段话解释这里借鉴一下参考[1] 首先nginx 是对外的服务接口外部浏览器通过url访问nginx,
nginx 接收到浏览器发送过来的http请求将包进行解析分析url如果是静态文件请求就直接访问用户给nginx配置的静态文件目录直接返回用户请求的静态文件 如果不是静态文件而是一个动态的请求那么nginx就将请求转发给uwsgi,uwsgi 接收到请求之后将包进行处理处理成wsgi可以接受的格式并发给wsgi,wsgi 根据请求调用应用程序的某个文件某个文件的某个函数最后处理完将返回值再次交给wsgi,wsgi将返回值进行打包打包成uwsgi能够接收的格式uwsgi接收wsgi 发送的请求并转发给nginx,nginx最终将返回值返回给浏览器。
要知道第一级的nginx并不是必须的uwsgi完全可以完成整个的和浏览器交互的流程但是要考虑到某些情况
a. 安全问题程序不能直接被浏览器访问到而是通过nginx,nginx只开放某个接口uwsgi本身是内网接口这样运维人员在nginx上加上安全性的限制可以达到保护程序的作用。
b. 负载均衡问题一个uwsgi很可能不够用即使开了多个work也是不行毕竟一台机器的cpu和内存都是有限的有了nginx做代理一个nginx可以代理多台uwsgi完成uwsgi的负载均衡。
c. 静态文件问题用django或是uwsgi这种东西来负责静态文件的处理是很浪费的行为而且他们本身对文件的处理也不如nginx好所以整个静态文件的处理都直接由nginx完成静态文件的访问完全不去经过uwsgi以及其后面的东西。
通用型网关接口CGI、FastCGI
网关接口是一种协议为了实现加载动态脚本。CGI程序则是实现了CGI协议的一种程序
Web服务器网关接口协议WSGI、ASGI、uwsgi
网关接口是用于Web应用与Web服务器进行通讯。其中WSGI、ASGI是专为python设计的网关接口。uwsgi是uWSGI服务器自有的传输协议
实现了Web服务器网关接口的软件有uWSGI注意大小写、uvicorn、gunicorn
同步异步同步是指执行是串行的需要处理完当前任务在处理一下异步指并行的现有的任务不影响下一个任务的执行。类比到请求上面就是假如同时有两个请求进来在同步处理的框架下第二个请求需要等第一个结束之后才能响应而异步就可以并行处理
Web框架
诸如Flask、Django这类pyhton Web框架可以被启动当成服务器的原因都是因为其自带启动了WSGI服务器才允许Web服务器与Web框架之间进行连接。效率极其低下一般生产可以使用gunicorn、gevent等WSGI服务器
这里请参考flask启动的案例Flask.run()
def run(self, hostNone, portNone, debugNone, load_dotenvTrue, **options): Runs the application on a local development server. Do not use run() in a production setting. It is not intended to meet security and performance requirements for a production server. Instead, see :ref:deployment for WSGI server recommendations. **** * # 省略了部分代码 * # 省略了部分代码 * # 省略了部分代码 from werkzeug.serving import run_simple try: run_simple(host, port, self, **options) * # 省略了部分代码 * # 省略了部分代码 * # 省略了部分代码 这里注意到run_simple我们继续跟踪进去看其代码如下
def run_simple( hostname, port, application, use_reloaderFalse, use_debuggerFalse, use_evalexTrue, extra_filesNone, reloader_interval1, reloader_typeauto, threadedFalse, processes1, request_handlerNone, static_filesNone, passthrough_errorsFalse, ssl_contextNone, ): Start a WSGI application. Optional features include a reloader, multithreading and fork support. 可以看到这里就是做启动WSGI服务的简单准备工作具体代码就不分析感兴趣的小伙伴可以去跟踪看下生成的过程
而FastAPI这类高性能、纯Web框架是没有带WSGI或者ASGI协议的服务器启动功能的所以我们在启动的时候需要用uvicorn等命令
总结框架是为了让我们专注于逻辑代码和业务的实现我们可以无需将时间和精力花在数据如何传输如何编码请求和响应是如何执行的。不过这中间可能会涉及到服务器之间的层层关系所以我们有必要了解一下整个链路来龙去脉
协议规范 支持的请求协议常见未列全 同步/异步 支持的框架 CGI HTTP CGI程序 WSGI HTTP 同步 FlupFlask ASGI HTTPHTTP2WebSocket等 同步/异步 FastAPIQuartSanicViboraTornado CGI CGI(Common Gateway Interface),通用网关接口它是一种协议是Web服务器和独立进程之间的协议它会把HTTP请求的Request的Header设置成进程环境变量HTTP请求的Body正文设置成进程的标准输入进程的标准输出设置为HTTP响应的Response。
早期的Web服务器只能响应浏览器发来的HTTP静态资源的请求随着技术的发展需要用到动态技术。由于Web服务器不能直接运行动态脚本为了解决Web服务器与应用程序之间数据互通出现了CGI。由于效率低下不安全等原因目前在生产环境基本被抛弃。
CGI程序 CGICommon Gateway Interface是一个接口规范或协议实现其规范的程序叫做CGI程序。Web客户端发送HTTP请求到Web服务端之后服务端通过CGI程序进行处理数据处理完的结果在逐层返回请看下图
我们常说的Web服务器一般是用于加载静态文件的请求有一些动态脚本的请求就会需要Web服务器创建一个新的进程来启动CGI程序也就是CGI程序进行加载动态脚本之后由Web服务器返回给客户端。
CGI程序可以是任何有标准输入和输出的脚本语言或者编程语言实现的但由于其漏洞大安全性低每次有动态页面请求都会启动一个CGI程序因此服务器压力特别大。逐渐出现了mod_perl、FastCGI等增强版本
WSGI Web服务器网关接口Python Web Server Gateway Interface缩写为WSGI它是一种专为python定义的接口规范用于web服务端和web应用框架之间的连接如此web应用可以一起处理一个请求同时也是基于CGI进行设计的
通俗的理解WSGI也是一种规范协议主要是建立一个适用于服务器与Web框架之间的接口。那么跟CGI类似的你可以通过自己的编程语言实现符合WSGI的应用程序下面看一下WIKI上面的例子
def app(environ, start_response): start_response(200 OK, [(Content-Type, text/plain)]) yield Hello world!\n 1 2 3 其中
第一行定义了一个名为 app 的 callable服务器网关接口#cite_note-2)接受两个参数environ 和 start_responseenviron 是一个字典包含了 CGI 中的环境变量。 第二行调用了start_response状态指定为“200 OK”消息头指定为内容类型是“text/plain”。start_response 也是一个 callable接受两个必须的参数statusHTTP 状态和 response_headers响应消息的头。 第三行将响应消息的消息体返回。 这里的流程请注意
Web客户端浏览器发送请求
HTTP服务器接收请求
实现了WSGI的服务器接收请求可以和2合并
a. 把环境变量和请求参数以及一个callback回调函数传递给Web应用程序
b. Web应用程序处理完之后通过回调函数返回给HTTP服务器
WSGI 协议包含两个部分一个是 WSGI 服务器端server另一个则是应用程序端(application)。即 WSGI 对上文中的 Web 应用程序也有比较严格协议规定。固编写 Web 应用程序通常需要使用支持 WSGI 协议的应用框架如 Django、Flask 等。
ASGI 异步网关接口Asynchronous Server Gateway Interface是WSGI的扩展版本旨在为Python Web服务、框架和应用之间提供一个标准的异步接口。其本身可以提供同步和异步应用并且可以并行处理。还能处理多种通用协议包括HTTPHTTP2和WebSocket。同WSGI一样需要有独立的服务器实现这种异步的网关接口比如Daphne、Uvicorn、Hypercorn等