Flask 框架详解:从安装到实战的全方位教程 – wiki大全


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>: 我们还可以指定变量的类型,如 intfloatpath。这里 post_id 必须是整数。

重启服务器后,访问 http://127.0.0.1:5000/user/Geminihttp://127.0.0.1:5000/post/123 看看效果。

4. 模板(Templates)

直接在 Python 代码中返回 HTML 是不切实际的。Flask 使用 Jinja2 这个强大的模板引擎来分离业务逻辑和页面表现。

第一步:创建 templates 文件夹

Flask 会自动在项目根目录下的 templates 文件夹中寻找模板。

bash
mkdir templates

第二步:创建 HTML 模板

templates 文件夹中创建一个 index.html 文件:

“`html






{{ title }}

{{ 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



{{ title }}

“`

  • 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 %}

  • {{ task.content }}
    {% if not task.done %}
    完成
    {% endif %}
    删除
  • {% endfor %}


“`

模板解析:
* {% 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 开发的大门。祝你编码愉快!

滚动至顶部