Flask 速查表:Quick Reference 备忘清单中的 Flask 入门实战指南
【免费下载链接】reference为开发人员分享快速参考备忘清单(速查表)项目地址: https://gitcode.com/jaywcjlove/reference
本指南以开源仓库 jaywcjlove/reference 中的 Flask 备忘清单 为主体,完整讲解 Flask 从安装启动、路由与视图、URL 规则、HTTP 方法到 Blueprint 蓝图模块化开发的全部入门要点。读完本文,你将能够独立写出可运行的 Flask 应用、正确配置路由转换器与重定向行为、用url_for安全地构建 URL,并通过蓝图拆分大型项目的模块。
写在前面:阅读本清单需要什么基础
本清单对 Flask 的入门进行了简要的概述,并给出了大量可直接复制的常用示例。开始之前,建议先具备以下基础:
- HTML 基础:Flask 视图函数默认返回 HTML 类型内容,浏览器会渲染字符串中的 HTML 标签;
- Python 基础:需要理解函数、装饰器、
__name__等基本概念,可对照仓库内的 Python 3 备忘清单 快速查阅语法; - Flask 框架基础认知:Flask 是一个使用 Python 编写的轻量级 Web 框架,核心设计是"路由(装饰器)+ 视图函数",通过
route()装饰器把 URL 路径绑定到函数上。
在 jaywcjlove/reference 仓库中,本清单收录于 docs/flask.md,并在 README.md 的"编程"分类下列为 Python 语言条目,与 Django 备忘清单、FastAPI 备忘清单 同属 Python Web 框架速查系列,方便对照学习。
第一个程序:Hello World
创建一个hello.py文件,内容如下:
# 导入 Flask 类 from flask import Flask # 创建应用实例 app = Flask(__name__) # 'Flask' 参数是 应用程序模块 或 包 的名称 # __name__是适用于大多数情况的便捷快捷方式 # 路由 (装饰器) @app.route('/') # route()装饰器告诉 Flask 什么路径触发下面的功能 def hello(): # 该函数返回我们想要在浏览器中显示的消息内容 return 'Hello World!' # 默认类型 HTML, 因此字符串中的 HTML 将被浏览器渲染 # 启动服务 if __name__ == '__main__': app.run()逐行解读这段最小应用:
Flask(__name__):Flask类的第一个参数是应用程序模块(或包)的名称。__name__是 Python 内置变量,在直接运行脚本时其值为'__main__',在被其他模块导入时为模块名。Flask 借助这个名称定位应用同级的静态文件、模板等资源,因此__name__是适用于大多数场景的便捷写法;@app.route('/'):route()装饰器告诉 Flask,当用户访问/这个路径时,触发下方定义的函数;- 视图函数返回值:函数返回的内容就是浏览器中显示的消息。默认类型为 HTML,因此如果返回字符串中包含
<b>等标签,浏览器会按 HTML 渲染。
运行hello.py的两种方式
在命令行执行:
$ python hello.py * Serving Flask app 'hello' * Running on http://127.0.0.1:5000 * Press CTRL+C to quit或者使用 Flask 提供的命令行工具(不依赖脚本内的app.run()):
$ flask --app hello run * Serving Flask app 'hello' * Running on http://127.0.0.1:5000 * Press CTRL+C to quit $ flask run --host=0.0.0.0两种方式的关键差异:
| 方式 | 命令 | 适用场景 |
|---|---|---|
| 脚本直跑 | python hello.py | 依赖代码中的app.run(),适合本地快速验证 |
| CLI 启动 | flask --app hello run | Flask 自动发现hello.py中的app实例,部署更灵活 |
其中--app hello指定应用所在模块(对应hello.py),--host=0.0.0.0让服务监听所有网络接口,便于局域网内的其他机器访问。默认监听地址为http://127.0.0.1:5000,即仅本机可访问的 5000 端口,按CTRL+C可以停止服务。
启用调试模式
开发阶段推荐开启调试模式,使用--debug选项:
$ flask --app hello --debug run调试模式会带来两个关键能力:
- 自动重载:修改代码后服务自动重启,无需手动停止再启动;
- 交互式调试器:请求出错时在浏览器中展示详细堆栈与调试面板,方便定位问题。
注意:调试模式仅用于开发环境,生产部署时务必关闭。
HTML 转义:防止 XSS 注入
视图函数返回的是 HTML 字符串,当 URL 参数被原样拼进返回内容时,用户输入的<script>等标签会被浏览器当作代码执行,形成跨站脚本(XSS)漏洞。Flask 推荐使用 MarkupSafe 提供的escape进行转义:
from markupsafe import escape @app.route("/<name>") def hello(name): return f"Hello, {escape(name)}!"当访问/John时返回Hello, John!;而当访问带恶意脚本的地址时,<、>等特殊字符会被转义为安全的 HTML 实体,从而被浏览器当作纯文本显示而非执行。凡是把用户可控输入拼进返回内容的地方,都应该使用escape处理。
路由与视图函数
route()装饰器用于把 URL 路径绑定到处理函数(视图函数)上,一个应用可以定义多个路由:
@app.route('/') def index(): return 'Index Page' @app.route('/hello') def hello(): return 'Hello, World'- 访问
http://127.0.0.1:5000/触发index(),返回Index Page; - 访问
http://127.0.0.1:5000/hello触发hello(),返回Hello, World。
这里的函数名(index、hello)被称为端点(endpoint),在后续的url_for构建 URL 时会用到,因此保持命名有意义很重要。
变量规则:URL 中的动态参数
URL 中可以包含可变部分,用<变量名>标记。视图函数接收同名参数:
from markupsafe import escape @app.route('/user/<username>') def show_user_profile(username): # 显示该用户的用户个人资料 return f'User {escape(username)}' @app.route('/post/<int:post_id>') def show_post(post_id): # 显示给定id的帖子,id是一个整数 return f'Post {post_id}' @app.route('/path/<path:subpath>') def show_subpath(subpath): # 在 /path/ 之后显示子路径 return f'Subpath {escape(subpath)}'/user/<username>:捕获任意字符串并传给username,用escape转义保证安全;/post/<int:post_id>:<int:>指定该段必须是整数,Flask 会自动做类型转换,非整数访问会返回 404;/path/<path:subpath>:<path:>允许匹配包含斜杠的路径,用于捕获/path/a/b/c这样的多级子路径。
转换器类型对照表
| 转换器 | 说明 | | :-- | -- | |string| (默认)接受任何没有斜杠的文本 | |int| 接受正整数 | |float| 接受正浮点值 | |path| 像字符串但也接受斜线 | |uuid| 接受 UUID 字符串 |
默认情况下变量段就是string类型,因此<username>等价于<string:username>。uuid转换器则要求该段必须是标准 UUID 格式,常用于资源 ID 校验。
唯一 URL 与重定向行为
尾部斜杠在 Flask 中是有语义的,它决定了 URL 是否"唯一":
@app.route('/projects/') def projects(): return 'The project page' @app.route('/about') def about(): return 'The about page'/projects/带尾部斜杠:该端点的规范 URL 有尾部斜杠,类似于文件系统中的文件夹。如果访问没有尾部斜杠的/projects,Flask 会自动 308 重定向到规范 URL/projects/,避免同一内容出现两个 URL 导致搜索引擎重复收录;/about不带尾部斜杠:类似于文件系统中的普通文件,访问/about/会返回 404 Not Found。
这一设计保证了每个资源只有一个规范 URL,是 Flask 路由"唯一 URL"(Unique URLs)原则的体现。
URL 构建:使用url_for而非手写路径
在模板或重定向中需要生成 URL 时,应使用url_for()而不是手写字符串路径。它根据端点名动态构建 URL,代码改动后无需同步修改各处引用:
from flask import url_for @app.route('/') def index(): return 'index' @app.route('/login') def login(): return 'login' @app.route('/user/<username>') def profile(username): return f'{username}\'s profile' with app.test_request_context(): print(url_for('index')) print(url_for('login')) print(url_for('login', next='/')) print(url_for('profile', username='John Doe'))url_for()的使用要点:
- 第一个参数是端点名(即视图函数名),如
'index'、'login'、'profile'; - 可携带额外的查询参数,如
url_for('login', next='/')会生成/login?next=/; - 对于带变量的路由,传入对应关键字参数即可,如
url_for('profile', username='John Doe')会生成/user/John%20Doe(空格被自动转义为%20); - 代码中的
app.test_request_context()创建一个测试请求上下文,使url_for在没有真实请求的情况下也能工作,方便在脚本或测试中验证生成的 URL。
相比硬编码路径,url_for的三大优势:路径随路由规则变化自动更新、参数自动编码转义、支持蓝图等复杂场景的前缀处理。
HTTP 方法:处理 GET 与 POST
默认情况下,路由只响应GET请求。可以通过route()装饰器的methods参数指定支持的 HTTP 方法,同一个视图函数内按方法分支处理:
from flask import request @app.route('/login',methods=['GET','POST']) def login(): if request.method == 'POST': return do_the_login() else: return show_the_login_form()其中request.method取值为当前请求的 HTTP 方法字符串(如'POST'、'GET'),request对象来自flask模块,封装了当前请求的所有信息。
快捷装饰器:按方法拆分视图
也可以把不同方法的处理逻辑拆成独立的视图函数。Flask 为每个常见 HTTP 方法提供了快捷装饰器:get()、post()等:
@app.get('/login') def login_get(): return show_the_login_form() @app.post('/login') def login_post(): return do_the_login()这种写法让每个函数职责单一:@app.get('/login')只响应 GET(展示登录表单),@app.post('/login')只响应 POST(处理登录逻辑),代码可读性和可维护性更好。methods参数与快捷装饰器是等价的,二者择一即可。
Blueprint 蓝图:模块化组织路由
随着应用规模增长,把所有路由写在一个文件里会难以维护。蓝图(Blueprint)是 Flask 提供的模块化机制,可以把一组相关的路由、模板、静态文件打包成独立模块,再注册到主应用上。
创建蓝图 Bp1
from flask import Blueprint, abort, jsonify # 定义Bp1,并定义url前缀为/img Bp1 = Blueprint('imgBlue', __name__, template_folder='templates', url_prefix='/img') @Bp1.route('/getimg') def getImg(): try: return jsonify(name="img", size="100KB") except Exception as e: abort(e)创建蓝图 Bp2
from flask import Blueprint, abort, jsonify # 定义Bp2,并定义url前缀为/video Bp2 = Blueprint('videoBlue', __name__, template_folder='templates', url_prefix='/video') @Bp2.route('/getvideo') def getvideo(): try: return jsonify(name="video", size="100GB") except Exception as e: abort(e)Blueprint()构造函数的常用参数:
| 参数 | 说明 |
|---|---|
| 第一个参数(名称) | 蓝图名,如'imgBlue'、'videoBlue',用于标识与url_for引用 |
__name__ | 蓝图所在模块名,用于定位蓝图资源 |
template_folder | 蓝图专属模板目录 |
url_prefix | URL 前缀,该蓝图下所有路由自动带上此前缀 |
两个蓝图内部都使用jsonify()返回 JSON 响应(自动设置Content-Type: application/json),出错时通过abort()终止请求并抛出对应错误。
在 Flask 应用中注册蓝图
在主应用文件中导入并注册 Bp1、Bp2,以lantu.img、lantu.video为例表示蓝图存放于包的子模块中:
from flask import Flask, jsonify from lantu.img import Bp1 from lantu.video import Bp2 app = Flask(__name__) # 注册蓝图到app app.register_blueprint(Bp1) app.register_blueprint(Bp2) @app.route('/') def index(): return jsonify(name='phyger') if __name__ == '__main__': app.run(host="127.0.0.1", debug=True)register_blueprint()把蓝图挂载到应用上,注册后蓝图内的所有路由(含url_prefix前缀)即生效。这里主应用也开启debug=True便于开发调试。
用 curl 简单测试
启动应用后,用curl验证三个端点的响应:
curl http://127.0.0.1:5000/ >> {"name":"phyger"} curl http://127.0.0.1:5000/img/getimg >> {"name": "img", "size": "100KB"} curl http://127.0.0.1:5000/video/getvideo >> {"name": "video", "size": "100GB"}可见:
/命中主应用视图,返回{"name":"phyger"};/img/getimg命中 Bp1(前缀/img+ 路由/getimg),返回图片元信息;/video/getvideo命中 Bp2(前缀/video+ 路由/getvideo),返回视频元信息。
三个路由互不干扰,验证了蓝图将/img/*与/video/*两组资源有效隔离、按业务模块组织代码的能力。
小结与下一步
至此,你已经掌握了 Flask 的核心入门技能:
- 应用创建与启动:
Flask(__name__)创建实例,python hello.py或flask --app hello run启动,--debug开启调试; - 路由体系:
@app.route()绑定 URL 与视图,支持string、int、float、path、uuid五类转换器; - URL 规范:尾部斜杠决定唯一 URL 与重定向行为,
url_for()按端点名安全构建 URL; - 请求处理:通过
methods参数或get()/post()快捷装饰器区分 HTTP 方法; - 模块化开发:用
Blueprint按业务域拆分路由,register_blueprint()注册,url_prefix隔离前缀; - 安全实践:对用户输入使用
escape转义,防止 XSS 注入。
本清单收录于 jaywcjlove/reference 仓库的 docs/flask.md,在 README.md 的"编程"分类下即可找到入口。若想继续深入 Python 语言本身,可查阅 Python 3 备忘清单;如需对比其他 Python Web 框架的写法,可对照 Django 备忘清单 与 FastAPI 备忘清单。将上述代码逐段复制运行、配合curl验证响应,是快速内化 Flask 路由与蓝图机制最有效的方式。
【免费下载链接】reference为开发人员分享快速参考备忘清单(速查表)项目地址: https://gitcode.com/jaywcjlove/reference
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考