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 框架源代码和它的设计,从中学习优秀框架的设计方法。
准备工作
下载源代码
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
安装依赖
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 的依赖要求,就可以使用。部分代码的行数和位置会和文章中提及的略有不同,请你注意。
浏览代码
推荐使用 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 简介的更多相关文章
- Inside Flask - flask 扩展加载过程
Inside Flask - flask 扩展加载过程 flask 扩展(插件)通常是以 flask_<扩展名字> 为扩展的 python 包名,而使用时,可用 import flask. ...
- Inside Flask - flask.__init__.py 和核心组件
Inside Flask - flask.__init__.py 和核心组件 简单的示例 首先看看一个简单的示例.使用 Flask ,通常是从 flask 模块导入 Flask . request 等 ...
- Flask (一) 简介
Flask简介 Flask是一个基于Python实现的Web开发‘微’框架 'MicroFramework' Django是一个重型框架 官方文档: http://flask.pocoo.org/do ...
- day92:flask:flask简介&基本运行&路由&HTTP请求和响应
目录 1.Flask简介 2.关于使用flask之前的准备 3.flask的基本运行 4.flask加载配置 5.传递路由参数(没有限定类型) 6.传递路由参数(通过路由转换器限定路由参数的类型) 7 ...
- python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架
Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...
- Flask - Flask的蓝图(BluePrint)
目录 Flask - Flask的蓝图(BluePrint) 一. 初始Flask蓝图 进阶Flask蓝图 使用蓝图做一个增删改查 1.使用蓝图进行web应用搭建: 2.使用Flask蓝图,查看学生信 ...
- [python][flask] Flask 图片上传与下载例子(支持漂亮的拖拽上传)
目录 1.效果预览 2.新增逻辑概览 3.tuchuang.py 逻辑介绍 3.1 图片上传 3.2 图片合法检查 3.3 图片下载 4.__init__.py 逻辑介绍 5.upload.html ...
- Flask 框架 简介
一.Flask介绍 Flask是一个基于Werkzeug,Jinja 2 轻量级的web开发框架, 使用Python开发, 上手简单. 二.安装Flask 三.第一个Flask程序 1.编写app.p ...
- Flask框架简介,常用扩展包及两大核心
Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架. Flask 本身相当于一个内核,其他几乎所有的功能都 ...
随机推荐
- eclipse java工程和maven工程的互相转换
eclipse java工程和maven工程的互相转换 maven转为工程一般工程: 工程右键--->Maven--->Disable Maven Nature转为一般工程. 一般工程转为 ...
- Linux kernel perf_swevent_init Local root Exploit
64位上编译 另外修改了原Exploit的一个错误 第76行 把 uint64_t *p = (void *) ¤t[i]; 改成 uint64_t *p = (void *) & ...
- LINUX 2.6.18-238 local root exp
/* * * * 1-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=0 * 0 _ __ __ __ 1 * ...
- Phaser.Game这个函数都有哪些参数
Phaser是一个简单易用且功能强大的html5游戏框架,利用它可以很轻松的开发出一个html5游戏.在这篇文章中我就教大家如何用Phaser来制作一个前段时间很火爆的游戏:Flappy Bird,希 ...
- Java集合之Map接口
Map使用键值对来存储数据,将键映射到值对象,一个映射不能包含重复的键,每一个键最多只能映射到一个值.Map接口的具体实现类:HashMap,Hashtable,TreeMap,LinkedHashM ...
- 【转】asp.net c# 网上搜集面试题目大全(附答案)
asp.net c# 网上搜集面试题目大全(附答案) http://www.cnblogs.com/hndy/articles/2234188.html
- Apache POI使用详解
Apache POI使用详解 1.POI结构与常用类 (1)POI介绍 Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案 ...
- Frenetic Python实验(一)
Follow: Github-Frenetic 准备: 所有的实验,第一步都需要开启控制器,命令: $ frenetic http-controller --verbosity debug 每一个实验 ...
- eclipse 版本号
Eclipse 3.1 版本代号 IO [木卫1,伊奥] Eclipse 3.2 版本代号 Callisto [木卫四,卡里斯托 ]Eclipse 3.3 版本代号 Eruopa [木卫二,欧罗巴 ...
- Ruby--String
--全部转为小写:[STR].downcase --全部转为大写:[STR].upcase --仅仅首字母为大写:[STR].capitalize --每个单词首字母为大写:[STR].titleiz ...