Flask 框架详解:从安装到实战的全方位教程
Flask 是一个用 Python 编写的轻量级 Web 应用框架。它被称为“微框架”,因为它只保留了核心功能:路由、请求处理、模板渲染等,而将数据库集成、表单验证、用户认证等高级功能交由扩展(Extensions)来实现。这种设计的哲学赋予了 Flask 极高的灵活性和可扩展性,使其成为从小型个人项目到大型企业应用都备受青睐的选择。
本教程将带你从零开始,一步步学习 Flask 的安装、核心概念,并最终构建一个简单的实战项目。
1. 准备工作与安装
在开始之前,请确保你的系统已经安装了 Python 和 pip(Python 的包管理器)。
第一步:创建并激活虚拟环境
为每个项目使用独立的虚拟环境是一个好习惯,它可以避免不同项目之间的依赖冲突。
打开你的终端(在 Windows 上是命令提示符或 PowerShell),执行以下命令:
“`bash
1. 创建一个项目文件夹并进入
mkdir flask_project
cd flask_project
2. 创建虚拟环境 (venv 是 Python 自带的模块)
python -m venv venv
3. 激活虚拟环境
在 Windows 上:
venv\Scripts\activate
在 macOS/Linux 上:
source venv/bin/activate
“`
激活成功后,你会在命令行提示符前看到 (venv) 字样。
第二步:安装 Flask
在激活的虚拟环境中,使用 pip 安装 Flask:
bash
pip install Flask
至此,我们的开发环境就准备就绪了。
2. 第一个 Flask 应用:”Hello, World!”
让我们来编写第一个 Flask 应用。在 flask_project 文件夹中创建一个名为 app.py 的文件,并输入以下代码:
“`python
app.py
from flask import Flask
创建一个 Flask 应用实例
app = Flask(name)
定义一个路由和视图函数
@app.route(‘/’)
def hello_world():
return ‘Hello, World!’
确保直接运行时才启动服务器
if name == ‘main‘:
app.run(debug=True)
“`
代码解析:
* from flask import Flask: 导入 Flask 类。
* app = Flask(__name__): 创建 Flask 应用的实例。__name__ 是一个 Python 内置变量,指向当前模块的名称。Flask 用它来确定应用根目录,以便查找模板和静态文件。
* @app.route('/'): 这是一个装饰器,它将 URL / (网站根目录) 与下面的 hello_world 函数绑定起来。
* hello_world(): 这个函数被称为视图函数(View Function),它返回的内容将作为 HTTP 响应显示在用户的浏览器上。
* app.run(debug=True): 启动 Flask 自带的开发服务器。debug=True 表示开启调试模式,这样在代码修改后服务器会自动重启,并且出错时会显示详细的错误信息。
运行应用:
在终端中,确保你仍处于 flask_project 目录且虚拟环境已激活,然后运行:
bash
python app.py
你将看到类似以下的输出:
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
现在,打开你的浏览器,访问 http://127.0.0.1:5000/,你将看到页面上显示的 “Hello, World!”。
3. 路由(Routing)
路由是 Flask 的核心,它负责将不同的 URL 请求分发给对应的 Python 函数处理。
动态路由
除了静态的 URL,我们还可以创建包含可变部分的动态路由。
修改 app.py:
“`python
@app.route(‘/user/
def show_user_profile(username):
return f’你好, {username}!’
@app.route(‘/post/
def show_post(post_id):
return f’文章 ID: {post_id}’
“`
/<username>: 尖括号中的部分是动态的,访问/user/Alice时,username参数就是'Alice'。/<int:post_id>: 我们还可以指定变量的类型,如int、float、path。这里post_id必须是整数。
重启服务器后,访问 http://127.0.0.1:5000/user/Gemini 和 http://127.0.0.1:5000/post/123 看看效果。
4. 模板(Templates)
直接在 Python 代码中返回 HTML 是不切实际的。Flask 使用 Jinja2 这个强大的模板引擎来分离业务逻辑和页面表现。
第一步:创建 templates 文件夹
Flask 会自动在项目根目录下的 templates 文件夹中寻找模板。
bash
mkdir templates
第二步:创建 HTML 模板
在 templates 文件夹中创建一个 index.html 文件:
“`html
{{ greeting }}
这是一个由 Flask 渲染的页面。
“`
{{ title }}和{{ greeting }}是 Jinja2 的变量占位符,它们的值将由 Flask 在渲染时动态传入。
第三步:修改视图函数以渲染模板
修改 app.py,使用 render_template 函数:
“`python
from flask import Flask, render_template
app = Flask(name)
@app.route(‘/’)
def index():
# 渲染模板,并传入动态数据
return render_template(‘index.html’, title=’首页’, greeting=’欢迎来到我的网站!’)
“`
现在刷新 http://127.0.0.1:5000/,你将看到一个包含动态标题和问候语的 HTML 页面。
5. 静态文件(Static Files)
CSS、JavaScript、图片等静态文件也需要被 Web 应用加载。
第一步:创建 static 文件夹
Flask 约定将静态文件存放在 static 文件夹中。
bash
mkdir static
第二步:创建 CSS 文件
在 static 文件夹中创建一个 style.css 文件:
“`css
/ static/style.css /
body {
font-family: ‘Arial’, sans-serif;
background-color: #f0f2f5;
color: #333;
text-align: center;
margin-top: 50px;
}
h1 {
color: #007bff;
}
“`
第三步:在模板中链接静态文件
修改 templates/index.html,使用 url_for() 函数来生成静态文件的 URL:
“`html
“`
url_for('static', filename='style.css')会生成/static/style.css的正确路径,这样做的好处是即使未来应用的 URL 结构改变,链接依然有效。
再次刷新页面,你会看到页面的样式已经生效。
6. 实战项目:一个简单的待办事项(To-Do List)
现在,我们将综合运用所学知识,创建一个简单的待办事项应用。
功能:
* 显示所有待办事项。
* 添加新的待办事项。
* 标记事项为“已完成”。
* 删除事项。
修改 app.py 如下:
“`python
app.py
from flask import Flask, render_template, request, redirect, url_for
app = Flask(name)
使用一个列表来模拟数据库
tasks = [
{‘id’: 1, ‘content’: ‘学习 Flask’, ‘done’: True},
{‘id’: 2, ‘content’: ‘创建一个待办事项应用’, ‘done’: False},
{‘id’: 3, ‘content’: ‘部署应用’, ‘done’: False}
]
next_id = 4
@app.route(‘/’)
def task_list():
return render_template(‘tasks.html’, tasks=tasks)
@app.route(‘/add’, methods=[‘POST’])
def add_task():
global next_id
content = request.form.get(‘content’)
if content:
tasks.append({‘id’: next_id, ‘content’: content, ‘done’: False})
next_id += 1
return redirect(url_for(‘task_list’))
@app.route(‘/complete/
def complete_task(task_id):
for task in tasks:
if task[‘id’] == task_id:
task[‘done’] = True
break
return redirect(url_for(‘task_list’))
@app.route(‘/delete/
def delete_task(task_id):
global tasks
tasks = [task for task in tasks if task[‘id’] != task_id]
return redirect(url_for(‘task_list’))
if name == ‘main‘:
app.run(debug=True)
“`
代码解析:
* request 对象:从 flask 导入,用于访问传入的请求数据,如表单内容 (request.form)。
* redirect, url_for: 用于在完成操作(如添加、删除)后重定向回任务列表页面。
* /add 路由指定了 methods=['POST'],表示它只接受 POST 请求,这通常用于处理表单提交。
现在,在 templates 文件夹中创建 tasks.html 文件:
“`html
我的待办事项
“`
模板解析:
* {% for task in tasks %}…{% endfor %}: Jinja2 的循环语法,用于遍历传入的 tasks 列表。
* {{ 'done' if task.done else '' }}: Jinja2 的条件表达式,如果任务已完成,则添加 done CSS 类。
* {% if not task.done %}…{% endif %}: Jinja2 的条件判断,只有未完成的任务才显示“完成”链接。
现在,运行 python app.py 并访问 http://127.0.0.1:5000/,你就有了一个功能齐全的待办事项应用!
7. 总结与后续学习
恭喜你!你已经掌握了 Flask 的基本概念,包括安装、路由、模板和静态文件处理,并构建了一个简单的 Web 应用。
Flask 的世界远不止于此,这只是一个开始。接下来,你可以继续探索:
* 数据库集成: 学习使用 Flask-SQLAlchemy 扩展来连接和操作数据库。
* 蓝图(Blueprints): 当应用变得复杂时,使用蓝图来组织和模块化你的代码。
* Web 表单: 使用 Flask-WTF 扩展来处理复杂的表单验证。
* 用户认证: 实现用户注册、登录和会话管理。
* RESTful API: 构建 API 服务。
* 部署: 将你的 Flask 应用部署到生产服务器上(例如 Gunicorn + Nginx)。
希望这篇教程能为你打开 Flask 开发的大门。祝你编码愉快!