Flask 教程:从零开始构建你的第一个 Web 应用
你是否曾经想过,自己也能做出一个像微信公众号后台那样的网页系统?或者想快速搭建一个个人博客、API 接口服务?其实,这一切并不遥远。今天,我们就来一起走进 Python 的轻量级 Web 框架——Flask,开启你的 Web 开发之旅。
Flask 以其简洁、灵活、易上手著称,特别适合初学者和中小型项目。它不像 Django 那样“大而全”,但正因为“小而美”,你能更清晰地理解 Web 请求的完整流程。接下来,我会用最接地气的方式,带你一步步搭建你的第一个 Flask 应用。
安装与环境准备
在动手之前,我们先确保开发环境就绪。Flask 是基于 Python 的,所以你需要先安装 Python 3.7 或更高版本(推荐 Python 3.10+)。
打开终端(Mac/Linux)或命令提示符(Windows),运行以下命令安装 Flask:
pip install flask
这条命令会从 Python 包管理器 PyPI 下载并安装 Flask 及其依赖。安装完成后,你可以通过下面的命令验证是否安装成功:
python -c "import flask; print(flask.__version__)"
如果输出类似 2.3.3 的版本号,说明安装成功。
💡 小贴士:建议使用虚拟环境(virtual environment)来管理项目依赖,避免不同项目之间的包冲突。你可以通过
python -m venv myenv创建一个虚拟环境,然后激活它(Windows 用myenv\Scripts\activate,Mac/Linux 用source myenv/bin/activate)。
创建你的第一个 Flask 应用
现在,我们来写一个最简单的 Flask 程序。想象一下,Flask 就像一位“交通指挥官”,它接收用户的网页请求,然后决定交给哪个“路段”(函数)处理。
创建一个文件,命名为 app.py,并输入以下代码:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
# 返回 HTML 内容,作为响应给浏览器
return '<h1>欢迎来到我的 Flask 应用!</h1><p>这是第一个页面。</p>'
if __name__ == '__main__':
app.run(debug=True)
✅ 代码详解:
from flask import Flask:导入 Flask 类,它是整个框架的核心。app = Flask(__name__):创建一个 Flask 应用对象。__name__是 Python 的内置变量,表示当前文件的模块名。@app.route('/'):这是装饰器,用来绑定 URL 路径和处理函数。/表示网站的首页。def home()::定义一个函数,处理首页请求。返回的内容会直接发送给浏览器。app.run(debug=True):启动内置的开发服务器。debug=True在开发时非常有用,能实时反馈错误并自动重载。
保存文件后,在终端运行:
python app.py
你会看到类似这样的输出:
* Running on http://127.0.0.1:5000
打开浏览器,访问 http://127.0.0.1:5000,你就能看到页面内容了!
路由与视图函数详解
Flask 的核心思想之一就是“路由驱动”。你可以把路由想象成“门牌号”,每个 URL 对应一个“房间”(视图函数),用户访问哪个 URL,就打开哪个“房间”。
除了根路径 /,你还可以定义多个路由。比如:
@app.route('/about')
def about():
return '<h2>关于这个应用</h2><p>这是一个简单的 Flask 教程演示。</p>'
@app.route('/user/<username>')
def show_user(username):
# <username> 是一个动态参数,用户访问 /user/张三 时,username 就是 '张三'
return f'<h3>欢迎用户:{username}</h3>'
📌 注意:
<username>是路径变量,Flask 会自动提取并传给函数参数。- 你可以在 URL 中传入任何字符串,比如访问
http://127.0.0.1:5000/user/李四,页面会显示“欢迎用户:李四”。
你还可以限制参数类型,比如只接受数字:
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'<p>文章 ID:{post_id}</p>'
这样,只有当 post_id 是整数时,请求才会匹配成功。如果用户访问 /post/abc,Flask 会返回 404 错误。
使用模板渲染 HTML
如果你只返回字符串,代码会越来越难维护。比如一个复杂的页面,HTML 代码和 Python 逻辑混在一起,看起来像“意大利面”。
这时,Flask 提供了模板系统(Jinja2),可以让你把 HTML 和 Python 逻辑分离。
首先,创建一个文件夹 templates,然后在里面创建 index.html:
<!-- templates/index.html -->
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>{{ title }}</h1>
<p>当前时间:{{ current_time }}</p>
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
</body>
</html>
✅ 模板语法说明:
{{ }}:用于输出变量。{% %}:用于控制结构,比如循环、条件判断。for item in items:遍历列表。if ... else也可以使用,比如{% if user %}。
然后在 app.py 中修改:
from flask import Flask, render_template
import datetime
app = Flask(__name__)
@app.route('/')
def home():
# 传递数据给模板
return render_template(
'index.html', # 指定模板文件
title='我的网站', # 传递给模板的变量
current_time=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
items=['Python', 'Flask', 'Web 开发', '学习']
)
if __name__ == '__main__':
app.run(debug=True)
✅ 关键点:
render_template()是 Flask 提供的函数,用于渲染模板。- 你可以在模板中使用 Python 传入的变量,比如
title、items。- 模板文件必须放在
templates目录下,Flask 会自动查找。
刷新浏览器,你会发现页面内容已经由模板控制,结构更清晰。
处理表单与 POST 请求
Web 应用不仅展示内容,还要接收用户输入。比如登录表单、评论提交等。
我们来做一个简单的表单提交功能。
在 templates/index.html 中添加表单:
<form method="POST" action="/submit">
<label>请输入你的名字:</label>
<input type="text" name="name" required>
<button type="submit">提交</button>
</form>
然后在 app.py 中添加处理 POST 请求的路由:
@app.route('/submit', methods=['GET', 'POST'])
def submit():
if request.method == 'POST':
# 获取表单数据
name = request.form['name']
return f'<h3>你好,{name}!表单已提交。</h3>'
else:
# GET 请求时显示表单
return '''
<form method="POST" action="/submit">
<label>请输入你的名字:</label>
<input type="text" name="name" required>
<button type="submit">提交</button>
</form>
'''
✅ 代码说明:
methods=['GET', 'POST']:允许处理两种请求方式。request.form['name']:获取表单中name字段的值。- 如果是 POST,就处理数据;如果是 GET,就返回表单页面。
现在访问 http://127.0.0.1:5000,输入名字并提交,页面会显示欢迎信息。
项目结构建议与部署准备
随着应用变大,建议将项目组织得更清晰。一个推荐的 Flask 项目结构如下:
my_flask_app/
├── app.py
├── config.py
├── templates/
│ └── index.html
├── static/
│ └── style.css
└── requirements.txt
config.py:存放配置,如数据库连接、调试开关。static/:存放 CSS、JS、图片等静态资源。requirements.txt:记录依赖包,方便他人复现环境。
你可以运行 pip freeze > requirements.txt 生成依赖列表。
部署时,可以使用 Gunicorn 或 uWSGI 配合 Nginx,但这属于进阶内容,适合项目上线时再学习。
总结
通过这篇 Flask 教程,我们从零开始构建了一个完整的 Web 应用。你学会了:
- 如何安装 Flask 并运行第一个应用;
- 如何定义路由和处理不同类型的请求;
- 如何使用模板系统分离 HTML 与逻辑;
- 如何处理表单数据;
- 如何规划项目结构。
Flask 的魅力在于“简单却不简陋”。它不强迫你遵循某种规范,而是让你自由选择架构。正如一位老程序员所说:“Flask 是给想写代码的人准备的框架。”
如果你已经完成了本教程,恭喜你!你已经迈出了成为全栈开发者的坚实一步。接下来,可以尝试集成数据库(如 SQLite 或 PostgreSQL)、添加用户认证、构建 RESTful API。
记住:每一个大项目,都是从一个 hello world 开始的。继续写下去,你一定能做出属于自己的 Web 应用。