Flask 教程(超详细)

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 传入的变量,比如 titleitems
  • 模板文件必须放在 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 应用。