Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI(Python Web Server Gateway Interface)工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 受权。
Flask也被称为 “microframework” ,由于它使用简单的核心,用 extension 增长其余功能。Flask没有默认使用的数据库、窗体验证工具
中文参考文档地址html
python 语言 web 框架不少:Django、Tornado、webpy、bottle……,flask 的特色是简单可扩展。简单有几个方面,好比它只实现 web 框架最核心的功能,保持功能的简洁;还有一个就是代码量少,核心代码 app.py
文件只有 2k+ 行。可扩展就是容许第三方插件来扩充功能,好比数据库可使用 Flask-SQLAlchemy
,缓存可使用 Flask-Cache
等等。
下面这段代码是 flask 官方文档给出的 hello world 版本的 flask 应用:python
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello, World!' if __name__ == '__main__': app.run()
要理解 flask 的源码,必须有必定的 python 基础(对 decorator、magic method、iterator、generator 概念比较熟悉),否则的话,会有些吃力。另一个必须理解的概念是 WSGI,简单来讲就是一套 web server 和 web 框架/web 应用之间的协议。能够阅读我以前写的 python wsgi 简介 和翻译的 什么是 web 框架 ,或者自行搜索相关资料,熟悉这部分的内容。web
flask 有两个核心依赖库:werkzeug
和 jinja2
,而 werkzeug
又是二者中更核心的。数据库
werkzeug
负责核心的逻辑模块,好比路由、请求和应答的封装、WSGI 相关的函数等;jinja2
负责模板的渲染,主要用来渲染返回给用户的 html 文件内容。json
模板(template)是和 web 框架相对独立的内容,好比 jinja 不是只能用在 web 应用中,而 web 应用也能够不处理模板(好比返回 raw text 或者 json/xml 结构数据,而不是 html 页面)。flask
直接使用 jinja2
而不是把这部分也作成可扩展的看起来有悖它的设计原则,我我的的理解是:flask 是个写网页的 web 框架,不像 flask-restful
能够专门作 json/xml
数据接口,必须提供模板功能,否则用户就没法使用。而若是不绑定一个模板库的话,有三种方法:本身写一个模板引擎、封装一个可扩展的模板层,用户能够本身选择具体的模板引擎、或者让用户本身处理模板。可是这些方法要么增长实现的复杂度,要么增长了使用的复杂度。flask
werkzeug
的定位并非一个 web 框架,而是 HTTP 和 WSGI 相关的工具集,能够用来编写 web 框架,也能够直接使用它提供的一些帮助函数。缓存
Werkzeug is an HTTP and WSGI utility library for Python.restful
werkzeug
提供了 python web WSGI 开发相关的功能:数据结构
好比,咱们可使用 werkzeug
编写一个简单的 hello world 的 WSGI app:app
from werkzeug.wrappers import Request, Response def application(environ, start_response): request = Request(environ) text = 'Hello %s!' % request.args.get('name', 'World') response = Response(text, mimetype='text/plain') return response(environ, start_response)
除了和 web WSGI 相关的功能,werkzeug 还实现了不少很是有用的数据结构和函数。好比用来处理一个 key 对应多个值的 MultiDict
,不支持修改的字典 ImmutableDict
,能够缓存类属性的 cache_property
等等。若是有机会,能够写篇文章讲讲 werkzeug
的源码(好吧,我又挖坑了)。
官网上,对 Jinja2
的 介绍已经很清晰,它就是一个 python 实现的模板引擎,功能很是丰富。
Jinja2 is a full featured template engine for Python. It has full unicode support, an optional integrated sandboxed execution environment, widely used and BSD licensed.
Jinja
功能比较丰富,支持 unicode 解析、自动 HTML escape 防止 XSS 攻击、继承、变量、过滤器、流程逻辑支持、python 代码逻辑集成等等。具体的功能和使用请参考官网的文档,这里就不介绍了。