Flask 教程

Flask 基本概念

既然你再次提到“基本概念”,我将换一种更结构化、更易记忆的方式为你梳理 Flask 的核心机制。这次我们聚焦于 “概念是什么 + 为什么这样设计 + 实际怎么用”,帮你建立清晰的认知框架。


🧠 Flask 设计哲学(一句话)

“微内核 + 插件化”:Flask 只提供 Web 开发最基础的骨架(路由、请求响应),其他功能(数据库、表单、登录等)全部通过扩展按需组装。


📦 6 大核心概念速览

概念作用类比/理解方式
1. 应用实例 app整个项目的“中枢大脑”像一家公司的总部,负责登记员工(路由)、制定规章(配置)、采购设备(扩展)
2. 路由 @app.route()将 URL 映射到 Python 函数公司的“前台接待”,根据来访者说的地址(URL)引导到对应部门(视图函数)
3. 视图函数处理业务逻辑并返回内容实际干活的员工,必须交出“可交付物”(字符串/HTML/JSON/Response)
4. 请求与响应对象封装客户端发来的数据和返回给客户端的数据快递单(request 装请求信息) & 包裹(response 装返回内容)
5. 上下文机制 ⭐让全局变量在并发请求中互不干扰“独立工作台”:每个请求有专属的 requestsession,不会串台
6. 蓝图 Blueprint大型项目的模块化方案“分公司”:把相关功能打包,最后统一挂靠到总部 app

🔍 重点拆解:为什么会有“上下文”?(新手最易困惑)

在 Web 服务器中,多个用户的请求是同时到达的。如果 request 是一个真正的全局变量,用户 A 的登录信息就会覆盖用户 B 的数据,导致严重的安全问题。

Flask 的解决方案是:上下文本地(Context Locals)

  • 它让 requestsessioncurrent_appg 看起来像全局变量,但底层使用了线程/协程隔离技术。
  • 每次请求进来时,Flask 会创建一个独立的上下文栈;请求结束时,栈被清空。

4 个上下文对象速记

对象所属上下文生命周期典型用途
request请求上下文单次请求内获取 URL 参数、表单、JSON、Headers
session请求上下文跨请求(基于加密 Cookie)保持用户登录状态、购物车
current_app应用上下文单次请求内在扩展或工具函数中访问主 app 配置
g应用上下文单次请求内请求级临时数据共享(如:提前查好的当前用户)

💡 记忆口诀requestsession客户端交互有关;current_appg服务器内部状态有关。


🔄 Flask 请求生命周期(数据流向)

纯文本
plaintext
客户端发起请求
   ↓
WSGI 服务器接收 → 推入【请求上下文】+【应用上下文】
   ↓
Flask 匹配路由 → 找到对应的视图函数
   ↓
执行 @app.before_request(如:检查登录状态)
   ↓
执行视图函数(读取 request → 处理业务 → 返回响应)
   ↓
执行 @app.after_request(如:统一添加响应头)
   ↓
弹出上下文(清空 g、释放资源) → 响应返回给客户端

🛠️ 实际开发中的最佳实践建议

  1. 不要把所有代码塞进 app.py:超过 3 个路由或 50 行代码,立刻开始用蓝图拆分。
  2. 永远不要在生产环境用 app.run(debug=True):调试模式会暴露堆栈信息,存在安全风险。生产应使用 Gunicorn / uWSGI + Nginx
  3. 善用 g 对象避免重复查询:在 before_request 中查好用户存入 g.user,后续视图直接调用,避免多次查库。
  4. API 项目优先用 jsonify:返回 {"code": 200, "data": [...]} 是前后端分离的标准做法。

📌 下一步方向

掌握这些概念后,你可以根据实际需求选择深入路径:

  • 🌐 想快速做网页?→ 学习 Jinja2 模板 + 静态文件
  • 🔌 想写 REST API?→ 学习 request.get_json() + jsonify + Flask-CORS
  • 🏗️ 项目变大?→ 学习 蓝图 (Blueprints) + 工厂模式 create_app()
  • 💾 需要存数据?→ 学习 Flask-SQLAlchemy

你想从哪个方向继续?我可以提供对应的最小可运行示例。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注