news 2026/9/23 18:12:17

Flask 速查表:Quick Reference 备忘清单中的 Flask 入门实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flask 速查表:Quick Reference 备忘清单中的 Flask 入门实战指南

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()

逐行解读这段最小应用:

  1. Flask(__name__)Flask类的第一个参数是应用程序模块(或包)的名称。__name__是 Python 内置变量,在直接运行脚本时其值为'__main__',在被其他模块导入时为模块名。Flask 借助这个名称定位应用同级的静态文件、模板等资源,因此__name__是适用于大多数场景的便捷写法;
  2. @app.route('/')route()装饰器告诉 Flask,当用户访问/这个路径时,触发下方定义的函数;
  3. 视图函数返回值:函数返回的内容就是浏览器中显示的消息。默认类型为 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 runFlask 自动发现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

这里的函数名(indexhello)被称为端点(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_prefixURL 前缀,该蓝图下所有路由自动带上此前缀

两个蓝图内部都使用jsonify()返回 JSON 响应(自动设置Content-Type: application/json),出错时通过abort()终止请求并抛出对应错误。

在 Flask 应用中注册蓝图

在主应用文件中导入并注册 Bp1、Bp2,以lantu.imglantu.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 的核心入门技能:

  1. 应用创建与启动Flask(__name__)创建实例,python hello.pyflask --app hello run启动,--debug开启调试;
  2. 路由体系@app.route()绑定 URL 与视图,支持stringintfloatpathuuid五类转换器;
  3. URL 规范:尾部斜杠决定唯一 URL 与重定向行为,url_for()按端点名安全构建 URL;
  4. 请求处理:通过methods参数或get()/post()快捷装饰器区分 HTTP 方法;
  5. 模块化开发:用Blueprint按业务域拆分路由,register_blueprint()注册,url_prefix隔离前缀;
  6. 安全实践:对用户输入使用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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/23 18:12:17

PowerAuras源码解析:3步看懂报错,选型避坑指南

PowerAuras源码解析:3步看懂报错,选型避坑指南 盯着控制台那一串红彤彤的 StackTrace ,是不是脑子瞬间宕机?别急着关浏览器,这堆乱码里藏着解决问题的钥匙。很多人卡在“报错一堆看不懂”这一步,其实是因为没搞懂 PowerAuras…

作者头像 李华
网站建设 2026/9/23 18:12:01

Java Web文献管理系统:Servlet+JSP+JDBC实战全解析

简介&#xff1a;本资源是一套基于Java Web技术栈开发的科技文献管理系统完整实现方案&#xff0c;面向高校计算机专业学生、Java初学者及课程设计实践者&#xff0c;解决文献分类管理、多角色权限控制与在线浏览下载等典型Web应用需求。压缩包共216个文件&#xff0c;包含25个…

作者头像 李华
网站建设 2026/9/23 18:11:59

二手车注意事项:面试必问的性能优化实战指南

二手车注意事项:面试必问的性能优化实战指南 报错一堆看不懂 StackTrace?别慌。这就像你买辆二手车,看着仪表盘报警灯亮成一片,心里直打鼓。很多开发者在接手遗留系统或高并发场景时,第一反应就是“这代码怎么写的”,然后陷入无尽的调试深渊。其实, 二手车注意事项…

作者头像 李华
网站建设 2026/9/23 18:11:34

tm远程开发避坑:3个最佳实践解决90%报错

tm远程开发避坑:3个最佳实践解决90%报错 刚接手tm远程项目,是不是也被那堆红彤彤的Stack Trace搞得头秃?明明本地跑得好好的,一到远程环境就报连接超时、权限拒绝,日志里全是看不懂的异常堆栈。别慌,这其实是环境差异和配置疏漏的典型表现。我在掘金技术社区看到不少同行分享过类似经历,大家普遍…

作者头像 李华
网站建设 2026/9/23 18:11:32

推送服务踩坑实录:源码解析API变更与5大致命错误

推送服务踩坑实录:源码解析API变更与5大致命错误 版本升级后 API 全变了,看着熟悉的接口突然返回 404 或者参数解析报错,这种绝望感每个搞推送服务的老兵都懂。别慌,这不是玄学,而是底层协议适配层没跟上业务迭代。今天咱们不扯虚的,直接通过源码解析,把 WebSocket 和 SSE…

作者头像 李华
网站建设 2026/9/23 18:11:19

田字笔顺开发避坑指南:保姆级教程解析Python与Rust实现差异

田字笔顺开发避坑指南:保姆级教程解析Python与Rust实现差异 官方文档翻了三遍,核心逻辑还是没跑通?别急,这篇保姆级教程直接切入要害,带你用代码拆解田字笔顺算法的底层逻辑。很多开发者卡在“笔顺数据结构”和“渲染时序”上,其实问题往往出在选型和细节处理上。 各自定位:为什么选这两种语言…

作者头像 李华