第 60 课:Web开发入门:Flask 框架简介
1. 学习目标
- 理解 什么是 Flask,以及它在 Python Web 开发中的定位。
- 掌握 Flask 应用的基本结构和核心组件(路由、视图函数)。
- 能够 独立创建并运行一个简单的 Flask "Hello World" Web 应用。
- 了解 HTTP 请求-响应的基本流程在 Flask 中是如何体现的。
- 为 后续学习 Flask 的路由、模板和更高级功能打下坚实基础。
2. 核心概念
什么是 Flask?
想象一下,你想盖一座房子。Python 是你的砖块和水泥,而 Flask 就是一套精良的施工蓝图和工具。它不会预先给你一座复杂的宫殿(像 Django 那样"全家桶"框架),而是给你最核心、最灵活的工具,让你根据自己的想法自由搭建。Flask 被称为 "微框架",这里的"微"不是指功能弱,而是指它的核心非常简单、轻量,但同时可以通过丰富的扩展(extensions)来增加数据库集成、表单验证、用户认证等任何你需要的功能。
为什么选择 Flask?
- 简单轻量:入门门槛低,代码直观,非常适合初学者理解 Web 开发的核心概念。
- 灵活性强:不强制使用特定的项目结构或组件,你可以自由选择。
- 强大的生态系统:拥有海量的第三方扩展。
- 被广泛应用:许多知名公司(如 Netflix、Reddit、LinkedIn)的部分服务都使用 Flask 构建。
Web 应用的基本工作原理
一个 Web 应用,本质上是一个运行在服务器上的程序,它等待并响应来自客户端(如浏览器)的请求。
- 用户在浏览器输入网址(例如
http://127.0.0.1:5000/)。 - 浏览器向你的 Flask 应用(服务器)发送一个 HTTP 请求(比如 GET 请求)。
- Flask 应用根据请求的 URL 路径,找到对应的处理函数(视图函数)。
- 视图函数执行逻辑(比如查询数据库),并生成要返回的内容(比如一段 HTML 文本)。
- Flask 应用将这段内容封装成一个 HTTP 响应,发送回浏览器。
- 浏览器收到响应并渲染,用户看到页面内容。
Flask 的核心就是帮助我们优雅地处理这个过程:路由将 URL 映射到函数,视图函数负责生成响应。
3. 代码示例
下面是一个完整的、可以立即运行的 Flask "Hello World" 应用。
# 1. 导入 Flask 类
from flask import Flask
# 2. 创建 Flask 应用实例
# __name__ 是一个特殊变量,Flask 用它来定位资源(如模板、静态文件)
app = Flask(__name__)
# 3. 定义路由和视图函数
# 使用 @app.route() 装饰器将 URL '/' 关联到下面的 hello_world 函数
@app.route('/')
def hello_world():
"""这是视图函数。当用户访问根目录时,这个函数会被调用。"""
# 它返回的内容就是用户在浏览器中看到的内容
return '<h1>Hello, World!</h1><p>欢迎来到我的第一个 Flask 应用!</p>'
# 4. 启动应用
if __name__ == '__main__':
# app.run() 启动 Flask 内置的开发服务器
# debug=True 会在代码修改后自动重启服务器,并显示详细错误信息(开发时使用)
# host='0.0.0.0' 让服务器对外部可见(在同一局域网内可以通过你的IP访问)
# port=5000 指定端口号
app.run(debug=True, host='0.0.0.0', port=5000)
如何运行和查看结果:
- 确保已安装 Flask。在终端或命令行中运行:
pip install flask - 将上面的代码保存为
app.py。 - 在终端运行:
python app.py - 你会看到类似
Running on http://127.0.0.1:5000/的输出。 - 打开浏览器,访问
http://127.0.0.1:5000/或http://localhost:5000/,你将看到"Hello, World!"页面。
代码解读:
from flask import Flask: 从flask包中导入Flask类。app = Flask(__name__): 创建一个 Flask 应用的实例。这是整个应用的起点。@app.route('/'): 这是一个装饰器,它告诉 Flask,当用户访问网站根目录(/)时,执行紧随其后的函数。def hello_world():: 这个函数称为视图函数。它的返回值就是浏览器看到的页面内容。app.run(...): 启动 Flask 的开发服务器,开始监听请求。
4. 实践练习
练习 1:添加新页面
在现有应用中,添加一个新的路由 /about,当用户访问时,返回一段关于你自己的介绍文字。
要求:
- 在
app.py中添加一个新的视图函数和对应的路由。 - 函数可以命名为
about()。 - 返回包含至少一个
<h2>标题和一个<p>段落的 HTML 字符串。
预期输出:
访问 http://localhost:5000/about 应该显示你定义的介绍信息。
练习 2:动态路由
创建一个路由 /hello/<name>,当用户访问 /hello/Alice 时,页面显示 你好, Alice! 欢迎来到Flask世界。。
要求:
- 使用 Flask 的路由变量功能
<name>来捕获 URL 中的动态部分。 - 在视图函数中接收这个
name参数,并将其插入到返回的字符串中。 - 试试访问不同的名字,如
/hello/Bob,看看效果。
预期输出:
访问 /hello/Charlie 应该显示:你好, Charlie! 欢迎来到Flask世界。
练习 3:简单的 JSON API
创建一个路由 /api/status,返回一个 JSON 格式的数据,例如 {"status": "running", "message": "服务正常"}。
要求:
- 从
flask中导入jsonify函数。 - 视图函数
status()使用jsonify()函数来创建一个 JSON 响应。 - 访问该 URL,检查浏览器或使用开发者工具查看返回的数据类型。
预期输出:
访问 /api/status 应该返回一个 JSON 对象,而非 HTML 页面。
5. 常见错误
- 忘记安装 Flask:运行时出现
ModuleNotFoundError: No module named 'flask'。- 解决:在终端执行
pip install flask。
- 解决:在终端执行
- 路由路径错误:访问页面时返回
404 Not Found。- 解决:检查
@app.route()中的路径是否正确,注意开头的/。
- 解决:检查
- 视图函数没有返回值:访问页面时出现服务器错误或空白。
- 解决:确保每个视图函数都有
return语句,返回一个字符串或响应对象。
- 解决:确保每个视图函数都有
- 端口冲突:启动时提示端口已被占用。
- 解决:关闭占用该端口的程序,或者在
app.run()中更改端口号,如port=5001。
- 解决:关闭占用该端口的程序,或者在
- 修改代码后无变化:在开发服务器中修改了代码,但刷新浏览器页面内容没变。
- 解决:确保在
app.run()中设置了debug=True,它会自动监测代码变化并重启服务器。如果没有开启,则需要手动在终端停止(Ctrl+C)并重启服务器。
- 解决:确保在
6. 小结
- Flask 是一个用 Python 编写的轻量级、灵活的 Web 微框架,非常适合入门和快速开发。
- 核心概念是 路由(
@app.route)和 视图函数。路由将 URL 绑定到函数,视图函数处理请求并返回响应。 - 一个最简单的 Flask 应用只需要几行代码:导入、实例化、定义路由、运行。
- 使用
app.run()启动 Flask 的开发服务器,通过浏览器访问localhost:端口号来测试。 - 从"Hello World"开始,你已经迈出了 Web 开发的第一步。下一节课,我们将深入学习 Flask 强大的 路由 系统和 模板 引擎,来构建更动态、更美观的网页。