flask等应用程序框架的基本原理

WSGI

所有的 Python Web框架都要遵循 WSGI 协议,在这里还是要简单回顾一下 WSGI 的核心概念。
WSGI 中有一个非常重要的概念:每个Python Web应用都是一个可调用(callable)的对象。
在 flask 中,这个对象就是 app = Flask(name) 创建出来的 app。
要运行web应用,必须有 web server,比如我们熟悉的apache、nginx,或者python中的gunicorn。

Server和Application之间怎么通信,就是WSGI的功能。
它规定了 app(environ, start_response) 的接口,server会调用 application,
并传给它两个参数:environ 包含了请求的所有信息,start_response 是 application 处理完之后需要调用的函数,参数是状态码、响应头部还有错误信息。

WSGI application 非常重要的特点是:它是可以嵌套的。换句话说,可以写个application,它做的事情就是调用另外一个 application,然后再返回(类似一个 proxy)。一般来说,嵌套的最后一层是业务应用,中间就是 middleware。这样的好处是,可以解耦业务逻辑和其他功能,比如限流、认证、序列化等都实现成不同的中间层,不同的中间层和业务逻辑是不相关的,可以独立维护;而且用户也可以动态地组合不同的中间层来满足不同的需求。

WSGI将Web服务分成两个部分:服务器和应用程序。
WGSI服务器只负责与网络相关的两件事:
接收浏览器的HTTP请求、向浏览器发送HTTP应答;
对HTTP请求的具体处理逻辑,则通过调用WSGI应用程序进行。

jinja2

Jinja2是一个功能齐全的模板引擎。它有完整的unicode支持,一个可选 的集成沙箱执行环境,被广泛使用。

from jinja2 import Template
template = Template('Hello !')
template.render(name='John Doe')

Werkzeug

Werkzeug是一个WSGI工具包。WSGI是一个web应用和服务器通信的协议,web应用可以通过WSGI一起工作。

def application(environ, start_response): 
    start_response('200 OK', [('Content-Type', 'text/plain')]) 
    return ['Hello World!']

如何理解wsgi, Werkzeug, flask之间的关系

Flask是一个基于Python开发并且依赖jinja2模版渲染和Werkzeug WSGI服务的一个微型框架,对于Werkzeug,它只是工具包,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理。将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。

Flask永远不会包含数据库层,也不会有表单库或是这个方面的其它东西。Flask本身只是Werkzeug和Jinja2的之间的桥梁,前者实现一个合适的WSGI应用,后者处理模板。当然,Flask也绑定了一些通用的标准库包,比如logging。除此之外其它所有一切都交给扩展来实现。为什么呢?因为人们有不同的偏好和需求,Flask不可能把所有的需求都囊括在核心里。大多数web应用会需要一个模板引擎。然而不是每个应用都需要一个SQL数据库的。Flask 的理念是为所有应用建立一个良好的基础,其余的一切都取决于你自己或者 扩展。