如何理解Nginx,WSGI,Flask之间的关系
1个回答
展开全部
Web框架层
常见的web框架有Flask,Django等,我们以Flask框架为例子,展示web框架的作用:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()123456789123456789
以上简单的几行代码,就创建了一个web应用程序对象app。
Web框架为我们提供路由管理,cookies管理等功能,让我们只需要关心业务的逻辑,提高开发的效率。
WSGI层
WSGI不是服务器,也不是用于与程序交互的API,更新不真实的代码,而只是一种接口。它只适用于Python语言,其全称为Web Server Gateway Interface,定义了web服务器和web应用之间的接口规范。也就是说,只要web服务器和web应用都遵守WSGI协议,那么web服务器和web应用就可以随意的组合。
def application(env, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [b"Hello World"]123123
代码中的env,start_response变量由web服务器传入,其中,env是一个字典,包含了类似HTTP_HOST,HOST_USER_AGENT,SERVER_PROTOCO等环境变量。start_response则是方法,接受两个参数,分别是status,response_headers。application方法设置http响应的状态码和Content-Type等头部信息,并返回响应具体结果。
上述代码就是一个完整的WSGI应用,当一个支持WSGI的web服务器(例如Nginx)接收到客户端的请求后,便会调用这个application方法。WSGI层并不需要关心env,start_response这两个变量是如何实现的,直接使用即可。
值得指出的是,WSGI是一种协议,需要区分几个相近的名词:
- uwsgi
同wsgi一样也是一种协议,uWSGI服务器正是使用了uwsgi协议
- uWSGI
实现了uwsgi和WSGI两种协议的web服务器。注意uWSGI本质上也是一种web服务器,处于上面描述的三层结构中的web服务器层。
- CGI
通用网关接口,并不限于python语言,定义了web服务器是如何向客户端提供动态的内容。例如,规定了客户端如何将参数传递给web服务器,web服务器如何将参数传递给web应用,web应用如何将它的输出如何发送给客户端,等等。
生产环境下的web应用都不使用CGI了,CGI进程(类似Python解释器)针对每个请求创建,用完就抛弃,效率低下。WSGI正是为了替代CGI而出现的。
说到这,我们基本理清了WSGI在web服务器与web框架之间作用:WSGI就像一条纽带,将web服务器与web框架连接起来。回到本文的题目,Nginx属于一种web服务器,Flask属于一种web框架,因此,WSGI与Nginx、Flask的作用就不明而喻了。
常见的web框架有Flask,Django等,我们以Flask框架为例子,展示web框架的作用:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()123456789123456789
以上简单的几行代码,就创建了一个web应用程序对象app。
Web框架为我们提供路由管理,cookies管理等功能,让我们只需要关心业务的逻辑,提高开发的效率。
WSGI层
WSGI不是服务器,也不是用于与程序交互的API,更新不真实的代码,而只是一种接口。它只适用于Python语言,其全称为Web Server Gateway Interface,定义了web服务器和web应用之间的接口规范。也就是说,只要web服务器和web应用都遵守WSGI协议,那么web服务器和web应用就可以随意的组合。
def application(env, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [b"Hello World"]123123
代码中的env,start_response变量由web服务器传入,其中,env是一个字典,包含了类似HTTP_HOST,HOST_USER_AGENT,SERVER_PROTOCO等环境变量。start_response则是方法,接受两个参数,分别是status,response_headers。application方法设置http响应的状态码和Content-Type等头部信息,并返回响应具体结果。
上述代码就是一个完整的WSGI应用,当一个支持WSGI的web服务器(例如Nginx)接收到客户端的请求后,便会调用这个application方法。WSGI层并不需要关心env,start_response这两个变量是如何实现的,直接使用即可。
值得指出的是,WSGI是一种协议,需要区分几个相近的名词:
- uwsgi
同wsgi一样也是一种协议,uWSGI服务器正是使用了uwsgi协议
- uWSGI
实现了uwsgi和WSGI两种协议的web服务器。注意uWSGI本质上也是一种web服务器,处于上面描述的三层结构中的web服务器层。
- CGI
通用网关接口,并不限于python语言,定义了web服务器是如何向客户端提供动态的内容。例如,规定了客户端如何将参数传递给web服务器,web服务器如何将参数传递给web应用,web应用如何将它的输出如何发送给客户端,等等。
生产环境下的web应用都不使用CGI了,CGI进程(类似Python解释器)针对每个请求创建,用完就抛弃,效率低下。WSGI正是为了替代CGI而出现的。
说到这,我们基本理清了WSGI在web服务器与web框架之间作用:WSGI就像一条纽带,将web服务器与web框架连接起来。回到本文的题目,Nginx属于一种web服务器,Flask属于一种web框架,因此,WSGI与Nginx、Flask的作用就不明而喻了。
微测检测5.10
2023-07-11 广告
2023-07-11 广告
IEC62133与en62133的区别如下:1. 认证机构不同:IEC62133是国际的标准,它以国际通用的标准进行生产;而en62133采用的是欧盟的标准,它使用欧盟的生产需求进行生产。2. 宗旨不同:IEC62133的宗旨是促进电气、电...
点击进入详情页
本回答由微测检测5.10提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询