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. 八、job管理

    查看用法: [root@super65 ~]# salt-run -d|grep jobs'jobs.active:' #查看当前执行的job Return a report on all activ ...

  2. 结合自己的程序对thinkphp模板常量的理解

    先上个图,有时候路径很多,没理解会搞混,看手册的说明 页面login.html模板的访问路径为http://www.tp.com/index.php/admin/Manager/login,测试他的常 ...

  3. unauthenticated user reading from net

    今天有台数据库异常,登录服务器后执行show processlist,发现大量的 unauthenticated user 状态.如下: 于是第一时间想到DNS反向解析的问题,于是看看是否关闭DNS解 ...

  4. java--测体重练习

    public class tz{ public static void main(String[] args){ int sg=165,tz=52;bz = sg-115 if (tz-bz>3 ...

  5. 获取某个Group中所有对象的DisplayName

    $SANs = Get-ADGroupMember -Identity "CN=gAPCHN-HGZ-IE10-Users,OU=Groups,OU=Hangzhou - China,OU= ...

  6. 【新产品发布】《GM1001 4~20mA 高精度电流采集模块》

    一.主要特性 1.测量精度高达±0.01%FS±0.002mA: 2.采样电阻仅10欧姆(20mA时压降仅0.2V),对被测系统影响  微乎其微: 3.差分输入,可测量正反电流无需改动硬件,使用方便: ...

  7. windows 下安装Yii2 高级版本

    1.  首先安装 Composer 2.  执行  composer global require "fxp/composer-asset-plugin:~1.1.1" 3. 执行 ...

  8. maven相关概念

    1.maven仓库分为:本地仓库,远程仓库.远程仓库分为私服.中央仓储和其他公共库. 2.mvn clean install 部署到本地仓库 3.mvn clean deploy 部署到远程仓储 4. ...

  9. HDU 1016 DFS

    很简单的深搜 只要看出来是深搜... 注意判断最后一点是否与加一为质数 #include<stdio.h> #include<string.h> #include<alg ...

  10. Javascript 笔记与总结(2-2)Javascript 变量

    js 的变量名可以由 _,数字,字母,$ 组成,且 不能以数字开头.在 jQuery 中就定义了一个全局变量 $ . 声明变量用 var 变量名,如果不用 var,则会污染全局. js 变量类型包括: ...