原文:
http://cizixs.com/2017/01/10/flask-insight-introduction
作者:cizixs
全文约 4792 字,读完可能需要 7 分钟。
flask 简介
Flask 官网上对它的定位是一个"微" python web 开发框架。
Flask is a micro web development framework for Python.
python 语言 web 框架很多:Django、Tornado、webpy、bottle……,flask 的特点是
简单可扩展
。简单有几个方面,比如它只实现 web 框架最核心的功能,保持功能的简洁;还有一个就是代码量少,核心代码
app
.
py
。
文件只有 2k+ 行。可扩展就是允许
第三方插件
来扩充功能,比如数据库可以使用
Flask
-
SQLAlchemy
,缓存可以使用
Flask
-
Cache
等等。
下面这段代码是 flask 官方文档给出的 hello world 版本的 flask 应用:
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 框架
,或者自行搜索相关资料,熟悉这部分的内容。
NOTE
:本系列文章分析的 flask 版本号是
0.12
,其他版本可能会有出入。
两个依赖
flask 有两个核心依赖库:
werkzeug
和
jinja
,而
werkzeug
又是两者中更核心的。
werkzeug
负责核心的逻辑模块,比如路由、请求和应答的封装、WSGI 相关的函数等;
jinja
负责模板的渲染,主要用来渲染返回给用户的 html 文件内容。
模板(template)是和 web 框架相对独立的内容,比如 jinja 不是只能用在 web 应用中,而 web 应用也可以不处理模板(比如返回 raw text 或者 json/xml 结构数据,而不是 html 页面)。
flask
直接使用
jinja2
而不是把这部分也做成可扩展的看起来有悖它的设计原则,我个人的理解是:flask 是个写网页的 web 框架,不像
flask
-
restful
可以专门做
json
/
xml
数据接口,必须提供模板功能,不然用户就无法使用。
而如果不绑定一个模板库的话,有三种方法:自己写一个模板引擎、封装一个可扩展的模板层,用户可以自己选择具体的模板引擎、或者让用户自己处理模板。但是这些方法要么增加实现的复杂度,要么增加了使用的复杂度。
werkzeug
的定位并不是一个 web 框架,而是 HTTP 和 WSGI 相关的工具集,可以用来编写 web 框架,也可以直接使用它提供的一些帮助函数。
Werkzeug is an HTTP and WSGI utility library for Python.
werkzeug
提供了 python web WSGI 开发相关的功能:
-
路由处理:怎么根据请求中的 url 找到它的处理函数
-
request 和 response 封装:可以更好地读取 request 的数据,也容易生成响应
-
一个自带的 WSGI server,可以用来测试环境运行自己的应用
比如,我们可以使用
werkzeug
编写一个简单的 hello world 的 WSGI 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