Flask源码分析01:框架简介

Flask是怎么样的框架

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 有两个核心依赖库:werkzeugjinja2,而 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

2.1 werkzeug

werkzeug 的定位并非一个 web 框架,而是 HTTP 和 WSGI 相关的工具集,能够用来编写 web 框架,也能够直接使用它提供的一些帮助函数。缓存

Werkzeug is an HTTP and WSGI utility library for Python.restful

werkzeug 提供了 python web WSGI 开发相关的功能:数据结构

  • 路由处理:怎么根据请求中的 url 找到它的处理函数
  • request 和 response 封装:能够更好地读取 request 的数据,也容易生成响应
  • 一个自带的 WSGI server,能够用来测试环境运行本身的应用

好比,咱们可使用 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 的源码(好吧,我又挖坑了)。

2.2 Jinja2

官网上,对 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 代码逻辑集成等等。具体的功能和使用请参考官网的文档,这里就不介绍了。

相关文章
相关标签/搜索