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 开发相关的功能:
比如,我们可以使用 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
,不支持修改的字典 ImmutableDict
,可以缓存类属性的 cache_property
等等。如果有机会,可以写篇文章讲讲 werkzeug
的源码(好吧,我又挖坑了)。
官网上,对 Jinja
的 介绍已经很清晰,它就是一个 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 代码逻辑集成等等。具体的功能和使用请参考官网的文档,这里就不介绍了。
阅读源代码是件耗时而又没有直接产出的事情,所以必须要事先明确目的,不然会白白浪费时间。对于我来说,一般需要阅读源码有几个可能的原因:
知道了自己要阅读代码,那么怎么去读代码呢?
原文:https://www.cnblogs.com/heirenxilou/p/13576379.html