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 框架原理和设计感兴趣的码农们打发打发时间

Inside Flask - Flask 简介的更多相关文章

  1. Inside Flask - flask 扩展加载过程

    Inside Flask - flask 扩展加载过程 flask 扩展(插件)通常是以 flask_<扩展名字> 为扩展的 python 包名,而使用时,可用 import flask. ...

  2. Inside Flask - flask.__init__.py 和核心组件

    Inside Flask - flask.__init__.py 和核心组件 简单的示例 首先看看一个简单的示例.使用 Flask ,通常是从 flask 模块导入 Flask . request 等 ...

  3. Flask (一) 简介

    Flask简介 Flask是一个基于Python实现的Web开发‘微’框架 'MicroFramework' Django是一个重型框架 官方文档: http://flask.pocoo.org/do ...

  4. day92:flask:flask简介&基本运行&路由&HTTP请求和响应

    目录 1.Flask简介 2.关于使用flask之前的准备 3.flask的基本运行 4.flask加载配置 5.传递路由参数(没有限定类型) 6.传递路由参数(通过路由转换器限定路由参数的类型) 7 ...

  5. python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...

  6. Flask - Flask的蓝图(BluePrint)

    目录 Flask - Flask的蓝图(BluePrint) 一. 初始Flask蓝图 进阶Flask蓝图 使用蓝图做一个增删改查 1.使用蓝图进行web应用搭建: 2.使用Flask蓝图,查看学生信 ...

  7. [python][flask] Flask 图片上传与下载例子(支持漂亮的拖拽上传)

    目录 1.效果预览 2.新增逻辑概览 3.tuchuang.py 逻辑介绍 3.1 图片上传 3.2 图片合法检查 3.3 图片下载 4.__init__.py 逻辑介绍 5.upload.html ...

  8. Flask 框架 简介

    一.Flask介绍 Flask是一个基于Werkzeug,Jinja 2 轻量级的web开发框架, 使用Python开发, 上手简单. 二.安装Flask 三.第一个Flask程序 1.编写app.p ...

  9. Flask框架简介,常用扩展包及两大核心

    Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架. Flask 本身相当于一个内核,其他几乎所有的功能都 ...

随机推荐

  1. 自制Chrome拓展

    淘宝试用自动点击: 谷歌其实就是一些html+css+js+静态资源.但是里面有一个特别的配置文件manifest.json.该文件和Android的那个androidmanifest.xml类似,记 ...

  2. [转]发送邮件提示“551 User not local; please try ”错误的原因及解决办法

    本文转自:http://www.biglee.cn/blog/article.asp?id=204 一网站要嵌入一个客户反馈系统.为了方便收集反馈信息,并能及时查看信息,我决定以将反馈内容提交到邮箱. ...

  3. OpenCV学习笔记——图像的腐蚀与膨胀

    顺便又复习了一下cvcopy如何进行图像拼接(最近觉得打开多幅图像分别看不如缩小掉放拼接到一幅图像上对比来的好) 首先把拼接的目标图像设置兴趣区域ROI,比如我有一个total,要把a.b.c分别从左 ...

  4. [IT新应用]存储入门-文件级存储及块级别存储的选择

    http://www.techrepublic.com/blog/the-enterprise-cloud/block-level-storage-vs-file-level-storage-a-co ...

  5. Thinkphp 不显示生成的验证码 【转载】

    在调用验证码之前加上 ob_clean(); 不显示验证码的代码: public function verify(){ $verify = new \Think\Verify(); $verify-& ...

  6. 【翻译】Kinect Studio是? 三月 SDK Update的新机能

      Kinect应用软件开发支援工具「Kinect Studio」的功能和用法的说明.由于可以记录/再生数据,让开发和调试变得更加简单.   Kinect SDK v2预览版的RTM版的预定在发布之前 ...

  7. Error when loading the SDK:

    android环境搭建:http://www.cnblogs.com/xdp-gacl/p/4322165.html eclipse启动,报了错.  解决: 从安装的android-sdk目录下的to ...

  8. PHP 用QueryList抓取网页内容

    http://www.cnblogs.com/wb145230/p/4716403.html 之前抓取网页数据都是用Java Jsoup,前几天听说用PHP抓更方便,今天就简单研究了一下,主要是用Qu ...

  9. Ecplise + Xdebug 一波三折终于能单步调试了

    http://my.oschina.net/012345678/blog/152889 Ecplise + Xdebug 一波三折终于能单步调试了 发表于2年前(2013-08-15 15:50)   ...

  10. typecho插件编写教程1 - 从HelloWorld说起

    typecho插件编写教程1 - 从HelloWorld说起 老高 187 5月25日 发布 推荐 0 推荐 收藏 2 收藏,189 浏览 最近老高正在编写一个关于typecho的插件,由于typec ...