之前看写flask 应用的一些疑问,百度上的答案解释的不错,这里记着以后可以看看
Web 服务器层
对于传统的客户端 - 服务器架构,客户端向服务器发送请求,服务器接收请求,处理请求,最后给客户端返回请求的响应,即简单来说,一个服务器的作用是:
接收请求
处理请求
返回响应
此文我们探讨web服务器,常见的web服务器有Nginx,Apache等。在这个三层结构中,web 服务器是最先接收到用户的请求的。
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()123456789 以上简单的几行代码,就创建了一个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"]123 代码中的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的作用就不明而喻了。
最后以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,我收到了,我把响应结果返回给客户端。大家合作愉快~

nginx,wsgi,flask之间的关系的更多相关文章

  1. 如何理解Nginx, WSGI, Flask之间的关系

    概览 之前对 Nginx,WSGI(或者 uWSGI,uwsgi),Flask(或者 Django),这几者的关系一存存在疑惑.通过查阅了些资料,总算把它们的关系理清了. 总括来说,客户端从发送一个 ...

  2. 如何理解Nginx, WSGI, Flask(Django)之间的关系

    如何理解Nginx, WSGI, Flask(Django)之间的关系 值得指出的是,WSGI 是一种协议,需要区分几个相近的名词: uwsgi 同 wsgi 一样也是一种协议,uWSGI服务器正是使 ...

  3. uWSGI、uwsgi、WSGI、之间的关系,为什么要用nginx加uWSGI部署。

    WSGI 协议 WSGI:是一种协议规范,起到规范参数的作用,就像告诉公路一样,规定超车靠右行,速度不低于90km/h,等.但这一切都是对双方进行沟通,比如,重庆到武汉这条高速路,这儿重庆和武汉就各为 ...

  4. uwsgi nginx与django之间的关系以及各自的作用

    首先要明确几个概念及其作用(注意大小写的区别): WSGI uWSGI uwsgi Nginx WSGI 是一种协议,不是任何包不是任何服务器,就和 TCP 协议一样.它定义了 Web 服务器和 We ...

  5. nginx、fastCGI、php-fpm关系梳理(转)

    前言: Linux下搭建nginx+php+memached(LPMN)的时候,nginx.conf中配需要配置fastCGI,php需要安装php-fpm扩展并启动php-fpm守护进程,nginx ...

  6. nginx、fastCGI、php-fpm关系梳理(转载 http://blog.sina.com.cn/s/blog_6df9fbe30102v57y.html)

        前言: Linux下搭建nginx+php+memached(LPMN)的时候,nginx.conf中配需要配置fastCGI,php需要安装 php-fpm扩展并启动php-fpm守护进程, ...

  7. nginx、fastCGI、php-fpm关系梳理(转载参考)

    nginx.fastCGI.php-fpm关系梳理 还可以参考:http://www.cnblogs.com/skynet/p/4173450.html   前言: Linux下搭建nginx+php ...

  8. nginx、fastCGI、php-fpm关系梳理

    前言: Linux下搭建nginx+php+memached(LPMN)的时候,nginx.conf中配需要配置fastCGI,php需要安装php-fpm扩展并启动php-fpm守护进程,nginx ...

  9. web服务器、WSGI跟Flask(等框架)之间的关系

    之前对 Nginx,WSGI(或者 uWSGI,uwsgi),Flask(或者 Django),这几者的关系一存存在疑惑.通过查阅了些资料,总算把它们的关系理清了. 总括来说,客户端从发送一个 HTT ...

随机推荐

  1. C++ 多态性浅谈

    多态:一个接口, 多种方法.程序在运行时才决定调用的函数是什么. C++多态通过 虚函数实现, 虚函数允许子类重新定义成员函数, 子类override父类. 多态与非多态的实质区别:函数地址是早绑定还 ...

  2. 模拟Spring依赖注入

    通过读取xml文件,利用反射动态加载类和方法,其实就是spring的注入机制模拟,可以清晰的看出整个运行流程 1.配置文件 applicationContext.xml <beans> & ...

  3. 初学swift笔记 继承(十)

    import Foundation /* 继承 class childClass: FatherClass{ } 优点 代码重用 缺点 增加程序的藕合度 父类的改变会影响子类 只能单继承 */ cla ...

  4. UVA 11134 Fabled Rooks

    贪心+优先队列+问题分解 对x,y 分开处理 当 xl<cnt(当前处理行)时,不能简单的选择cnt,而是应该让xl=cnt 并重新加入优先队列.(y的处理同上) #include <io ...

  5. python操作redis-set

    #!/usr/bin/python #!coding: utf-8 import redis if __name__=="__main__": try: conn=redis.St ...

  6. 处理编译错误"0" is an invalid value for the "DebugInformation" parameter of the "DCC"

    在编译“MustangpeakCommonLib-master.zip”时,遇到了这个问题.网上搜了一下: 处理编译错误"0" is an invalid value for the "DebugIn ...

  7. 解决C/C++程序执行一闪而过的方法(三种办法)

    简述 在VS编写控制台程序的时候,包括使用其他IDE(Visual C++)编写C/C++程序,经常会看到程序的执行结果一闪而过,要解决这个问题,可以在代码的最后加上system(“pause”).g ...

  8. Signal ()函数详细介绍 Linux函数

    http://blog.csdn.net/ta893115871/article/details/7475095 Signal ()函数详细介绍 Linux函数 signal()函数理解 在<s ...

  9. Django学习笔记(三)—— 型号 model

    疯狂暑期学习 Django学习笔记(三)-- 型号 model 參考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'defaul ...

  10. 依赖注入及AOP简述(六)——字符串请求模式 .

    2.     依赖注入对象的请求模式 前一节我们讨论了关于声明注入点的几种方法,这一节主要来介绍在注入点上如何定位到所需要的标识符的话题.基本上,我们可以用字符串为标识符来请求依赖对象.或者用全类名( ...