Flask是由Python语言编写开发而成的轻量级的Web开发框架,它的作者Armin Ronacher是个大神级人物,同样也是jinja,werkzeug的作者,所以不奇怪flask使用jiaja做为模板渲染,使用werkzeub做为wsgi,flask非常的小巧,也够简单,上手很快,在用了一段时间flask之后反过来学习flask原理,之前很多不理解的地方有了一个更清晰的认识,收益坡多,这里也不过多的去剖析源码,毕竟不是专业研发人士,先理解几个概念:
Web服务
前面说flask是一个轻量级的Web开发框架,首先我们需要大致了解一下web服务的原理,在这里引用该博客里的一张图片说明:
中间可能还涉及到其它的如负载均衡,高可用配置等,但不管整体是用什么框架,客户端请求<==>[业务逻辑处理]<==>服务器响应都逃不过这个流程(如果是静态资源的话可能没有业务逻辑处理就返回给了客户端),flask做为一个web也不例外,只不过flask使用了很简单的核心,其它功能则通过扩展插件来实现.
WSGI
WSGI (web server gateway interface),全称叫应用服务网关接口,是为 Python 语言定义的Web服务器和Web应用程序之间的一种简单而通用的接口.从名字就可以看出来,这东西是一个Gateway,也就是网关.网关的作用就是在协议之间进行转换.
WSGI将web服务我们可以分为2层:服务器+应用程序,服务器只负责处理一些跟底层相关的接口,屏蔽底层的具体实现,如接收http请求,返回http请求,而应用程序则负责业务逻辑的处理,WSGI工作流程如下图所示:
Jinja
flask使用jinja做为模板渲染,现发展到了jinja2,所谓的模板渲染,一般情况下,虽然请求不同,但是响应中的数据的展示方式是相同的,通俗点说就是除了我们请求获得的数据不一样外,其他都是一样的,那么我们就可以设计一个模板(除了数据内容可以改动,其他都是固定的HTML文件).这样我们就不必为每一个请求都写一个页面,我们只需要把一类相同的请求转发到一个模板文件即可,这个模板可以是单独的一个模板,也可以通过模板继承而来.jiaja有自己的语法,同样支持像python一样的宏、循环、判断等语法结构.这个有机会后续再说,jinja2有流程如下:
路由转发
路由转发其它就是当一个请求到达服务器之后,需要如何确认该请求要有哪个业务模块处理的过程呢,查找url跟视图的对应关系的程序就叫路由,flask使用werkzeug做路由转发,说白了就是flask内部会维护一个url跟视图函数的对应关系(这个对应关系其实分为2层),http请求传递过来的url,通过这个对应关系找视图函数,路由转发使用大量的装饰器,非常的简洁,具体的细节,大家可以参考这篇Flask源码解读 <1> — 浅谈Flask基本工作流程,写得挺不错。
Example
在Flask中,我们处理一个请求的流程就是,首先根据用户提交的URL来决定由哪个业务逻辑函数来处理,然后在函数中进行操作,取得所需的数据.再将取得的数据传给相应的模板文件中,由Jinja2负责渲染得到HTTP响应内容,即HTTP响应的HTML文件,然后由Flask返回响应内容.
flask如此的简单,就算我们不知道上述的这些概念,看几个官方的例子也能了解一二
1 | from flask import Flask,render_template |