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. 通过console口连接交换机

    最近发现有人不会通过console口连接交换机. 想想当初我还是小白的时候也是如此啊,如是写下教程. 虽然略简单... 1.连线: console线:(Console---usb) 2.安装驱动 (可 ...

  2. Html - 404页面

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  3. C# - Dbhelp

    dbhelp.cs using System; using System.Data; using System.Data.Common; using System.Configuration; pub ...

  4. HDU 1176 免费馅饼(记忆化搜索)

    免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  5. 文件上传(springMVC+ckeditor)

    1.首先添加springMVC文件上传的jar commons-fileupload-1.2.2.jar和commons-io-2.0.1.jar (maven项目可以使用 <dependenc ...

  6. Android shell 命令总结

    Package Manage(PM) pm list packages [FILTER] 查看已安装的应用包 -f 显示关联的apk文件 -s 只在系统应用中搜索Filter -3 只在第三方应用中搜 ...

  7. PHP 设计模式 笔记与总结(7)适配器模式

    ① 适配器模式可以将截然不同的函数接口封装成统一的 API ② 实际应用举例:PHP 的数据库操作有 mysql,mysqli,pdo 三种,可以用适配器模式统一成一致.类似的场景还有 cache 适 ...

  8. ThinkPHP 学习笔记 ( 五 ) 数据验证

    根据官网的教程 ( http://www.thinkphp.cn/info/171.html ),数据验证的使用静态定义方式 ( 以 regex 为例 ) 无法验证数据: 而采用动态验证则正常: 控制 ...

  9. 字符数组char

     数组做sizeof的参数不退化,传递给strlen就退化为指针: #include<stdio.h> #include<stdlib.h> #include<strin ...

  10. 西秦的ACE-Python教程 一、Python本地开发环境部署

    西秦的ACE-Python教程 一.Python本地开发环境部署       西秦 级别: 论坛版主 发帖 1357 云币 2782 加关注 写私信   只看楼主 更多操作楼主  发表于: 10-10 ...