跳到主要内容
Python Flask 框架核心原理与开发实践 | 极客日志
Python
Python Flask 框架核心原理与开发实践 Flask 是轻量级 Python Web 框架,基于 Werkzeug 和 Jinja2。文章介绍了虚拟环境配置、WSGI 规范基础、路由与视图函数、可变 URL 及自定义转换器。涵盖请求对象处理、响应与会话管理、配置文件加载、工厂模式创建应用实例。讲解钩子函数机制、蓝图模块化设计以及 Flask-SQLAlchemy 扩展使用,适合快速迭代开发场景。
暖阳 发布于 2025/2/23 更新于 2026/4/23 1 浏览Python Flask 框架核心原理与开发实践
Flask 是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug,模板引擎则使用 Jinja2。Flask 使用 BSD 授权。
Flask 也被称为 "microframework",因为它使用简单的核心,用 extension 增加其他功能。Flask 没有默认使用的数据库、窗体验证工具。
1. Flask Web 框架介绍
Flask 是微型 web 框架,框架本身十分精简。微型并不代表其功能弱,核心代码基于 Werkzeug, Jinja 2 这两个库,它以插件形式的进行功能扩展,且插件易于安装与使用,并且可以自行开发扩展插件。
与其他 web 框架类似,flask 中请求 (request), 路由 (route), 响应 (response) 构成其完整的一个基本 http 流程。
2. 入门 Flask 框架非常易于使用
了解其基本结构后,可以迅速进行 MVC 开发,或者将其当作后端 restfulApi 来响应数据。
第一步:虚拟环境安装 Flask
虚拟环境将当前运行环境完全与系统的 python 环境进行隔离,这里我们使用 pyenv 这个库来进行构建环境。
以 centos 系统为例安装虚拟环境依赖:
yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel
配置环境变量,在 ~/.bash_profile 里增加如下内容:
export PATH="~/.pyenv/bin:$PATH "
eval "$(pyenv init -) "
eval "$(pyenv virtualenv-init -) "
第二步:生成虚拟环境并激活
系统中一般自带的 python 版本是 python2.7.10。
我们自行下载一个 python 版本是 2.7.12。
使用镜像源找到 python 版本是 2.7.12 的包下载到本地。
为何需要使用虚拟环境?因为虚拟环境对于每一个 python 环境来说是独立开来的,用虚拟环境可以在一台机器上运行多个项目时,每个项目的环境是隔离,不产生依赖。
如需其他版本也可以下载对应的版本放到 ~/.pyenv/cache 文件夹下面(cache 文件夹假如不存在,自行创建)。
然后执行 pyenv install 版本号 安装对应的 python 版本:pyenv install 2.7.12。
安装 2.7.12 版本成功后,创建一个目录为完全隔离的 python 虚拟环境:
pyenv virtualenv 2.7.12 venv27
mkdir -pv virtu
cd virtu
pyenv local venv27
cd ..
自动激活了 venv27 环境。
第三步:安装 Pip
Pip 是一个用来安装 python 第三方库的工具。
sudo yum -y install epel-release
sudo yum -y install pip
使用阿里云的 python 包加速 pip 安装,Pip 配置阿里云镜像:
mkdir ~/.pip
vim ~/.pip/pip.conf
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn
第四步:安装 Flask cd venv27
pip install flask
pip freeze
列出当前安装的第三方 python 库以及版本。运行 python 终端,import flask,可以测试是否安装 flask 成功。
3. WSGI 规范 Python 使用 wsgi 网关进行 Web 开发,flask 基于 wsgi 网关,flask 中实例的 app,也称之为一个 wsgi 应用。
WSGI 是 python 中定义的一种网关协议规范,pep333 对此的相关解释:
from wsgiref.simple_server import make_server
wsgiref 包是实现了 wsgi 标准的一个参考,我们可以用它来进行调试,此包一般用于测试环境,不建议生产环境中使用。
simple_server 实现了一个简易的 http 服务器,我们可以用它来运行一个 wsgi 应用。
下面的示例我们可以用 wsgiref 这个包实现一个简单的 wsgi web 框架来理解其工作流程:
def application (environ, start_response ):
status = '200 OK'
response_headers = [('Content-type' , 'text/plain' )]
start_response(status, response_headers)
return [b'Hello World' ]
if __name__ == '__main__' :
from wsgiref.simple_server import make_server
server = make_server('localhost' , 8000 , application)
print ('Serving on port 8000...' )
server.serve_forever()
上面的代码中,我们使用了 wsgiref 包简易的实现了一个 wsgi web 框架,其中我们依据传入的 env 中获取到 url 后缀来匹配 router 字典中对应的处理函数。
Env 参数是包含了客户端请求的信息和服务端的环境信息,可以将其打印出来,看下其中包含的变量。
Start_response 函数作为参数传入 runserver 应用中,必须要 start_response(status,header) 来进行响应,它是由网关接口定义的函数。
在上述中可以看出,wsgi 的作用是在 web 服务器和 web 应用之间的桥梁,web 服务器监听将客户端请求转发给实现 wsgi 规范接口处理,wsgi 接将请求进行中转给上层的 web 应用处理,web 应用处理完成并生成响应返回给 wsgi 接口,然后 web 服务器将收到的响应返回给客户端。
Flask 框架也是依据上面的规范实现的 web 框架,我们可以看下 flask 源码中对于上述的封装,不过它做了更高层次的抽象。
4. 最基本应用
Hello World
from flask import Flask
app = Flask(__name__)
@app.route('/' )
def index ():
return '<h1>Hello World!</h1>'
if __name__ == '__main__' :
app.run()
应用分析 app = Flask(__name__) 代码使用 Flask 类生成一个应用实例。
@app.route('/') 映射了 url 链接与一个 python 函数的对应关系,我们将 index 函数称之为视图函数。
---> app.route('/')
访问 192.168.1.19/blog:---> app.route('/blog')
可变 URL 在一般业务中,url 都是动态可变的,在 flask 中我们这样设置可变 url:
@app.route('/hello/<name>' )
def hello (name ):
return '<h1>hello {}</h1>' .format (name)
访问 192.168.1.19/hello/jack
访问 192.168.1.19/hello/rose
<name> 被尖括号抱起来的部分代表 url 中与 python 处理函数中对应的可变部分。
常用的有以下 3 种,定义可变的类型:<string:name>、<int:uid>、<path:prefix>。
自定义转换器 定义可变 url,除了上述的 string 之外,还有以下几种 int、float、path 这三种,另外 flask 还可以通过 werkzeug 中的 BaseConverter 类,自定义转换器。
from werkzeug.routing import BaseConverter
class ListConverter (BaseConverter ):
def to_python (self, value ):
return value.split('+' )
def to_url (self, values ):
return '+' .join(BaseConverter.to_url(value) for value in values)
app.url_map.converters['list' ] = ListConverter
@app.route('/home/<list:subs>' )
def home (subs ):
htm = ''
for sub in subs:
htm += '<h1>{}</h1>' .format (sub)
return htm
在生产环境中客户端到服务端,使用 python 开发应用的一般流程是如下图所示:
5. Flask 入门:请求与响应
请求对象 from flask import request
@app.route('/hi' )
def hi ():
name = request.args.get('name' )
return '<h1>hi {}</h1>' .format (name)
访问:192.168.1.19/hi?name=mike
flask 中 request 对象封装了客户端的请求参数。我们可以尝试将 print(request.dict ) 查看请求上下文环境变量。
request 请求对象是 flask 内部封装的一个全局对象,这个对象是线程隔离的,必须运行在当前请求中的上下文,直接运行会报错,它通过 werkzeug 模块中 localproxy 在 localstack 这种数据结构寻找当前请求。
request.args: 获取从客户端 url 传输过来的查询字符串
request.form: 获取从客户端表单提交过来的信息
request.json: 获取从客户端从请求 body 获取的 json 字符串
request.method: 获取客户端使用的请求方法
Request.files: 获取从客户端请求过来的文件
响应与会话 from flask import make_response
resp = make_response('hello' .encode())
resp.set_cookie('name' , 'jack' )
return resp
flask 中封装了 make_response 作为客户端响应,返回 http 头信息、状态码等,可以将 resp 作为返回,可以手动灵活的增加了 cookie。
会话分为客户端和服务端 2 种形式,from flask import session 中封装了基于客户端的 cookies。
在 app.config 对象中保存了 flask 的默认配置以及我们项目中写入的配置变量,通常情况下 flask 中的一些配置如下。
6. 配置与工厂模式
读入配置 app = Flask(__name__)
app.config.from_object('yourapplication.default_settings' )
app.config.from_pyfile('config.cfg' )
上面两种都可以将配置文件加入到 app 应用当中,其中 app.config.from_object() 方法会寻找配置文件为类的配置。
用函数封装配置文件写入 app,这样可以依据参数来区分开发环境与生产环境的配置文件。
工厂方法创建 App 什么是工厂方法?工厂方法是一种设计模式,这里使用可以简单理解为通过一个函数来批量创建一个 flask app 对象,依据不同的参数来生成不同的 app。
当需要运行 app 的时候,可以通过工厂方法传递参数来生成不同的 app 对象,方便的进行测试不同的 app,并且生成多个 app 的时候可以进行分别进行请求处理,流量负载等。
7. 钩子函数 flask 中钩子函数作用是将被装饰的函数注册到 app 当中,在不同阶段执行。
app.first_request: 在第一次请求之前执行
app.before_request: 在每次请求之前执行,可以用它来封装中间键,效果类似于 django middleware
app.after_request: 在每次请求之后执行
app.teardown_appcontext: 不管是否有异常出现,都会在每次请求之后执行
app.errorhandler: 接受状态码,并且自定义返回错误处理信息页面
before_request 示例 @app.before_request
def before_request ():
pass
errorhandler 示例 @app.errorhandler(404 )
def not_found (error ):
return 'Not Found' , 404
8. 蓝图 (Blueprint) 蓝图将应用进行模块化,能够很方便的将不同的功能和路由区分开,并且易于维护,蓝图基于相同的 url 前缀来作区分。
功能类似的视图函数组合在一起作为蓝图的组件,将应用进行分割,极大简化了大型应用的复杂度,蓝图要注册到 app 对象中,蓝图的使用方式与 app 的使用方式很像。
蓝图生成 将 user 这些相似的功能分成一个蓝图模块,注意蓝图文件不能和蓝图对象同名,否则会冲突报错。
蓝图注册 当以上 user 实例化时,必须将此注册到 app 应用中,蓝图才能生效,url_prefix 为自定义添加的 url 后缀。
from flask import Blueprint
user_bp = Blueprint('user' , __name__, url_prefix='/user' )
@user_bp.route('/' )
def index ():
return 'User Home'
app.register_blueprint(user_bp)
9. Flask 扩展使用 flask 以插件形式开发扩展功能,其中许多优秀第三方插件可以直接使用,提升开发效率,常见项目开发用到的插件有 flask_sqlalchemy、flask_redis、flask_login、flask_admin 等等。
插件安装一般使用 pip install <插件名>,即可安装。
以下示例 flask_sqlalchemy 使用,flask_sqlalchemy 是 sqlalchemy 的 flask 插件,sqlalchemy 是 python 界有名的工业级 orm 框架。
flask_sqlalchemy 初始化 实例化 flask_sqlalchemy,生成 db 对象后续初始化到 app 中。
由于 db 对象需要读取 app 应用中配置,并且依赖 app 上下文工作,所以将上述 db 对象等扩展插件初始化 app,在每次 app 启动之前完成绑定。
定义 Model 使用上述 db 对象,model 字段继承 db.Model,在 mvc 中此表示 model 层,用来进行数据库表字段映射关联以及数据写入保存等。
用户验证 以上介绍了 flask 中入门开发常见的问题以及模块使用,使用 flask 可以轻松开发应用,每一种 web 框架都有其自身利弊,对于现代 web 开发的需求来说,微框架很适合快速迭代式开发,最好的理解的方法是实践,可以依据以上对 flask 有一个大体理解之后进行一个简单的应用开发。
相关免费在线工具 curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
HTML转Markdown 将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
JSON 压缩 通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online