Inside Flask - Flask 简介

时间:2023-03-09 08:16:31
Inside Flask - Flask 简介

Inside Flask - Flask 简介

前言

Flask 的设计目标是实现一个 wsgi 的微框架,其核心代码保持简单和可扩展性,很容易学习。对于有一定经验初学者而言,跟着例子和一些书的代码来学习,很快就能上手并使用到开发过程中。最近都在做 python web 方面的开发,使用 Flask 作为框架。最初匆匆忙忙啃了点 Flask 方面的资料,学习了相关的概念和一些例子,就能开始动手设计和实现(推荐一本入门的书,非常适合初学者 Flask Web开发:基于Python的Web应用开发实战)。

Flask 是一个易于学习和使用的框架,并不意味 Flask 就能使应用开发变得简单。应用的开发需要充分了解业务需求和业务领域知识,不是一朝一夕的就能解决的,也不是一两个像 Flask 、 Django 的开发框架就能帮你处理完的。即使像 Flask 这样的框架,在实际使用场景中,还需要增加很多扩展组件才能完成相应的功能,而每个组件都需要花费学习成本。

网上已经有很多 Flask 的优秀资料和例子,因此我不打算再写 Flask 的使用例子。但是当想进一步了解 Flask 的设计和源代码时,就无法找到完整的资料。因此,我打算写一系列的文章记录探索 Flask 框架源代码和它的设计,从中学习优秀框架的设计方法。

准备工作

  1. 下载源代码

    Flask 是开源的,托管在 github https://github.com/mitsuhiko/flask 。本次源代码分析基于 0.10.1 版本,可以直接在 web 上下载 0.10.1 分支的源代码 zip 压缩包,或者通过 git clone 的方式下载。

     git clone git@github.com:mitsuhiko/flask.git
    git checkout 0.10.1
  2. 安装依赖

    Flask 是一个微框架,不像其它框架那样依赖于很多组件,但还是依赖于一些现有的优秀库,包括 Werkzeug 、 Jinja2 和 itsdangerous (见源代码的 setup.py )。这里使用 virtualenv 安装 python3 环境和依赖,linux 或 mac 在源代码目录下运行命令:

     virtualenv -p python3 env
    source env/bin/activate
    pip install -r Werkzeug Jinja2 itsdangerous

    windows 上一点不同,在 source ... 这一步应为

     env\Scripts\activate

    我下载的依赖库的版本为当前最新的版本,分别为:

     Werkzeug==0.11.5
    Jinja2==2.8
    itsdangerous==0.24

    如果你下载的依赖库版本不一致,只要符合 Flask 的依赖要求,就可以使用。部分代码的行数和位置会和文章中提及的略有不同,请你注意。

  3. 浏览代码

    推荐使用 pycharm 或 pydev 来查看代码。这两个 IDE 都能支持从函数引用等快速跳转到源代码,使用极其简单。

简单开始

Flask 的核心代码并不庞大,为了提升一下大家的信心,我统计了一下 Flask 0.10.1 的源代码,

find flask -type f | xargs wc -l
find flask -type f | grep -v testsuite | xargs wc -l
find flask/testsuite -type f | xargs wc -l

flask 目录里面包括 flask 源代码和测试代码,一共是 10192 行,其中源代码 5374 行,测试代码 4818 行。这样的代码规模和 openstack 等开源项目相比,非常小,很适合学习。事实上,如果去掉了注释行和 docstring ,那么这个代码量那要继续减少一半,只剩下 2709 行!!::

find flask -type f | grep -v testsuite | xargs cat | \
sed -e '/^[[:space:]]*#/d' -e '/""".*"""/d' \
-e '/"""/,/"""/d' | wc -l

(上面的统计不一定精确)

由此可见,这么精简的一个框架居然能提供丰富完善的 web 编程功能,实在是非常让人惊奇,其设计必有过人之处,非常值得深入学习研究。

首先,看看顶层文件目录结构

.
├── .git # git 元数据目录
├── .gitignore # .gitignore
├── .gitmodules # .gitmodules
├── .idea # pycharm 元数据目录
├── .travis-devel-requirements.txt # travis 配置文件
├── .travis-lowest-requirements.txt # travis 配置文件
├── .travis-release-requirements.txt # travis 配置文件
├── .travis.yml
├── AUTHORS # 项目贡献者
├── CHANGES # 变更记录
├── LICENSE # LICENSE
├── MANIFEST.in # 打包时文件清单
├── Makefile # Makefile
├── README # README
├── artwork # LOGO 的矢量文件,svg 格式
├── docs # 文档目录
├── env # 自己建立的 virtualenv 环境,会通过 .gitignore 忽略
├── examples # 示例
├── flask # 主要代码
├── run-tests.py # 执行测试脚本
├── scripts # 辅助脚本
├── setup.cfg # 安装配置文件
├── setup.py # 安装脚本
└── tox.ini # tox 配置文件

各个文件和目录的作用都很明确。在后续的文章中,主要关注 flask 目录中的源代码。

最后,重新强调这一系列的文章不介绍 Flask 的入门例子,而是对 Flask 的核心源代码的学习和分析,只为让 Flask 框架原理和设计感兴趣的码农们打发打发时间