文档章节

如何理解Nginx、uWSGI和Flask之间的关系?

_Change_
 _Change_
发布于 2017/03/30 13:57
字数 1390
阅读 3112
收藏 112

总括来说,客户端从发送一个 HTTP 请求到 Flask 处理请求,分别经过了 web 服务器层,WSGI层,web框架层,这三个层次。不同的层次其作用也不同,下面简要介绍各层的作用。 输入图片说明

图1:web服务器,web框架与 WSGI 的三层关系

Web服务器层

对于传统的客户端 - 服务器架构,其请求的处理过程是,客户端向服务器发送请求,服务器接收请求并处理请求,然后给客户端返回响应。在这个过程中,服务器的作用是:

  • 接收请求
  • 处理请求
  • 返回响应

Web服务器是一类特殊的服务器,其作用是主要是接收 HTTP 请求并返回响应。提起 web服务器大家都不会陌生,常见的 web服务器有 Nginx,Apache,IIS等。在上图1的三层结构中,web服务器是最先接收用户请求的,并将响应结果返回给用户。

Web框架层

Web框架的作用主要是方便我们开发 web应用程序,HTTP请求的动态数据就是由 web框架层来提供的。常见的 web框架有Flask,Django等,我们以 Flask 框架为例子,展示 web框架的作用:

from flask import Flask
app = Flask(__name__)
@app.route('/hello')
def hello_world():
    return 'Hello World!'
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)

以上简单的几行代码,就创建了一个 web应用程序对象 app。 app 监听机器所有 ip 的 8080 端口,接受用户的请求连接。我们知道,HTTP 协议使用 URL 来定位资源,上面的程序会将路径 /hello 的请求交由 hello_world 方法处理, hello_world 返回 'Hello World!' 字符串。对于 web框架的使用者来说,他们并不关心如何接收 HTTP 请求,也不关心如何将请求路由到具体方法处理并将响应结果返回给用户。Web框架的使用者在大部分情况下,只需要关心如何实现业务的逻辑即可。

WSGI层

WSGI 不是服务器,也不是用于与程序交互的API,更不是真实的代码,WSGI 只是一种接口,它只适用于 Python 语言,其全称为 Web Server Gateway Interface,定义了 web服务器和 web应用之间的接口规范。也就是说,只要 web服务器和 web应用都遵守WSGI协议,那么 web服务器和 web应用就可以随意的组合。

下面的代码展示了 web服务器是如何与 web应用组合在一起的

def application(env, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return [b"Hello World"]

方法 application由 web服务器调用,参数 env, start_response 由 web服务器实现并传入。其中, env是一个字典,包含了类似 HTTPHOST,HOSTUSERAGENT,SERVERPROTOCO 等环境变量。 start_response则是一个方法,该方法接受两个参数,分别是 status, response_headers。 application方法的主要作用是,设置 http 响应的状态码和 Content-Type 等头部信息,并返回响应的具体结果。

上述代码就是一个完整的 WSGI 应用,当一个支持 WSGI 的 web服务器接收到客户端的请求后,便会调用这个 application 方法。WSGI 层并不需要关心 env, start_response 这两个变量是如何实现的,就像在 application 里面所做的,直接使用这两个变量即可。

值得指出的是,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 的作用就不明而喻了。

Nginx,WSGI,Flask 之间的对话

  • Nginx:Hey,WSGI,我刚收到了一个请求,我需要你作些准备,然后由Flask来处理这个请求。
  • WSGI:OK,Nginx。我会设置好环境变量,然后将这个请求传递给Flask处理。
  • Flask:Thanks WSGI!给我一些时间,我将会把请求的响应返回给你。
  • WSGI:Alright,那我等你。
  • Flask:Okay,我完成了,这里是请求的响应结果,请求把结果传递给Nginx。 WSGI:Good job!
  • Nginx,这里是响应结果,已经按照要求给你传递回来了。
  • Nginx:Cool,我收到了,我把响应结果返回给客户端。大家合作愉快~

© 著作权归作者所有

上一篇: ubuntu上安装nginx
下一篇: Pycharm下集成Pylint
_Change_
粉丝 20
博文 173
码字总数 94480
作品 0
普陀
QA/测试工程师
私信 提问
加载中

评论(5)

还是一只小星星
还是一只小星星
WSGI是在打酱油。可以省去中间商吗
__zero__
__zero__
WSG就是python的一个规范吧, 程序里面就是一个接口而已, 其他的web框架都要实现这个接口
零速巡航
零速巡航
倒数第二个应该是WSGI?
larryhu
larryhu
“WSGI 只是一种接口,它只适用于 Python 语言,其全称为 Web Server Gateway Interface,定义了 web服务器和 web应用之间的接口规范。”
并非只适用于python 其他语言也可以
b
bingtel
Nginx:Hey,WSGI,我刚收到了一个请求,我需要你作些准备,然后由Flask来处理这个请求。……Nginx不会知道flask的存在的
Linux搭建Python web环境(nginx + flask + uwsgi)

去年的时候,就曾使用Nginx+Flask+uwsgi搭建过python的web环境。但在最近搭建的时候,又去网上找了一遍教程,所以打算写一篇笔记做下记录。 在搭建之前,有必要了解下发送一个请求的整个流程...

liuchungui
2018/05/14
0
0
在 Ubuntu 上使用 Nginx 部署 Flask 应用

我职业生涯的大部分都在使用微软的架构,最近我决定走出技术的舒适区,步入开源软件世界。我现在日常工作的项目是一个RESTful服务,这个服务需要在主流硬件上运行,且能够按照需要进行水平拓...

greatghoul
2013/09/26
54.3K
18
centos服务器uWSGI 和 Nginx 部署 Flask 项目

前言 前段时间手贱买了几个月的腾讯云服务器。我一个做移动端的买国内服务器干啥,又不能搭梯子。最后想用python爬写数据写几个接口用app玩玩试试看看。 可惜自己只用过servelet,python的w...

静默加载
2018/08/10
0
0
flask+uwsgi+supervisor+nginx在局域网服务器上部署实践

flask可以快速的搭建http服务,但是为了搭建网站还是需要web服务器和相关监控管理操作,一套flask、uwsgi、supervisor、nginx是较好的完整解决方案。 本文对自己学习做一个记录,以一个简单的...

zoulala
2018/09/05
196
0
python + flask + uwsgi + gevent + nginx 环境搭建(非阻塞)

Flask是Python中一个微型的Web开发框架。在debug 模式 或 单纯的 uwsgi模式下,flask是阻塞模式的,也就是说一次只能效应一个请求,或者在uwsgi 开启多进程,响应已知的请求个数;我们这里使...

dchuang
2015/08/09
5K
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka实战(五) - 核心API及适用场景全面解析

1 四个核心API ● Producer API 允许一个应用程序发布一串流式的数据到一个或者多个Kafka topic。 ● Consumer API 允许一个应用程序订阅一个或多个topic ,并且对发布给他们的流式数据进行处...

JavaEdge
今天
11
0
实现线程的第三种方式——Callable & Future

Callable Runnable 封装一个异步运行的任务, 可以把它想象成为一个没有参数和返回值的异步方 法。Callable 与 Runnable 类似, 但是有返回值。Callable 接口是一个参数化的类型, 只有一 个...

ytuan996
今天
12
0
OSChina 周六乱弹 —— 不要摁F了!

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 : 朴树写的词曲都给人一种莫名的失落感,不过这首歌他自己却没有唱,换成赵传这种高音阶嘶喊的确很好,低沉但却有力,老男人的呐喊...

小小编辑
今天
24
1
Android Binder机制 - interface_cast和asBinder讲解

研究Android底层代码时,尤其是Binder跨进程通信时,经常会发现interface_cast和asBinder,很容易被这两个函数绕晕,下面来讲解一下: interface_cast 下面根据下述ICameraClient例子进行分析...

天王盖地虎626
昨天
13
0
计算机实现原理专题--存储器的实现(二)

计算机实现原理专题--存储器的实现(一)中描述了一种可以记住输入端变化的装置。现需要对其功能进行扩充,我们将上面的开关定义为置位,下面的开关定义为复位,然后需要增加一个保持位,当保...

FAT_mt
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部