ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

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

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()逐行解读这段最小应用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 CTRLC to quit或者使用 Flask 提供的命令行工具不依赖脚本内的app.run()$ flask --app hello run * Serving Flask app hello * Running on http://127.0.0.1:5000 * Press CTRLC to quit $ flask run --host0.0.0.0两种方式的关键差异方式命令适用场景脚本直跑python hello.py依赖代码中的app.run()适合本地快速验证CLI 启动flask --app hello runFlask 自动发现hello.py中的app实例部署更灵活其中--app hello指定应用所在模块对应hello.py--host0.0.0.0让服务监听所有网络接口便于局域网内的其他机器访问。默认监听地址为http://127.0.0.1:5000即仅本机可访问的 5000 端口按CTRLC可以停止服务。启用调试模式开发阶段推荐开启调试模式使用--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 fHello, {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 fUser {escape(username)} app.route(/post/int:post_id) def show_post(post_id): # 显示给定id的帖子id是一个整数 return fPost {post_id} app.route(/path/path:subpath) def show_subpath(subpath): # 在 /path/ 之后显示子路径 return fSubpath {escape(subpath)}/user/username捕获任意字符串并传给username用escape转义保证安全/post/int:post_idint:指定该段必须是整数Flask 会自动做类型转换非整数访问会返回 404/path/path:subpathpath:允许匹配包含斜杠的路径用于捕获/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 有尾部斜杠类似于文件系统中的文件夹。如果访问没有尾部斜杠的/projectsFlask 会自动 308 重定向到规范 URL/projects/避免同一内容出现两个 URL 导致搜索引擎重复收录/about不带尾部斜杠类似于文件系统中的普通文件访问/about/会返回 404 Not Found。这一设计保证了每个资源只有一个规范 URL是 Flask 路由唯一 URLUnique 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, usernameJohn Doe))url_for()的使用要点第一个参数是端点名即视图函数名如index、login、profile可携带额外的查询参数如url_for(login, next/)会生成/login?next/对于带变量的路由传入对应关键字参数即可如url_for(profile, usernameJohn 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、GETrequest对象来自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 提供的模块化机制可以把一组相关的路由、模板、静态文件打包成独立模块再注册到主应用上。创建蓝图 Bp1from flask import Blueprint, abort, jsonify # 定义Bp1并定义url前缀为/img Bp1 Blueprint(imgBlue, __name__, template_foldertemplates, url_prefix/img) Bp1.route(/getimg) def getImg(): try: return jsonify(nameimg, size100KB) except Exception as e: abort(e)创建蓝图 Bp2from flask import Blueprint, abort, jsonify # 定义Bp2并定义url前缀为/video Bp2 Blueprint(videoBlue, __name__, template_foldertemplates, url_prefix/video) Bp2.route(/getvideo) def getvideo(): try: return jsonify(namevideo, size100GB) 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.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(namephyger) if __name__ __main__: app.run(host127.0.0.1, debugTrue)register_blueprint()把蓝图挂载到应用上注册后蓝图内的所有路由含url_prefix前缀即生效。这里主应用也开启debugTrue便于开发调试。用 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),仅供参考
返回列表