Python 学习教程(第2篇):用 Flask 开发你的第一个 Web 应用

第一章:安装 Flask

Flask 是一个轻量级的 Python Web 框架,适合初学者快速上手。

1.1 创建并激活虚拟环境(推荐)

在项目文件夹中执行:

复制代码
python -m venv flask_env
  • Windows 激活:

    复制代码
    flask_env\Scripts\activate
  • macOS / Linux 激活:

    复制代码
    source flask_env/bin/activate

1.2 安装 Flask

复制代码
pip install flask

验证安装:

复制代码
python -c "import flask; print(flask.__version__)"

若输出版本号(如 3.0.0),说明安装成功。


第二章:Hello World Web 应用

2.1 创建应用文件

新建文件 app.py,输入以下代码:

复制代码
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello, World! 这是我的第一个 Flask 应用。"

if __name__ == '__main__':
    app.run(debug=True)

2.2 运行应用

在终端执行:

复制代码
python app.py

你会看到类似输出:

复制代码
 * Running on http://127.0.0.1:5000

打开浏览器,访问 http://127.0.0.1:5000,即可看到页面内容。

debug=True 表示开启调试模式,代码修改后会自动重启服务器。


第三章:路由与动态 URL

3.1 基本路由

复制代码
@app.route('/about')
def about():
    return "关于我们"

访问 /about 即可看到内容。

3.2 动态路由(传递参数)

复制代码
@app.route('/user/<name>')
def user(name):
    return f"你好,{name}!"

访问 /user/张三,页面显示:"你好,张三!"

<name> 是变量,Flask 会自动传入函数参数。


第四章:使用模板渲染 HTML

直接返回字符串不适合复杂页面。Flask 支持 Jinja2 模板引擎

4.1 创建模板目录

在项目根目录下创建文件夹 templates

4.2 编写 HTML 模板

templates 中新建 index.html

复制代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>我的 Flask 应用</title>
</head>
<body>
    <h1>欢迎,{{ name }}!</h1>
    <p>当前时间:{{ time }}</p>
</body>
</html>

4.3 在视图中渲染模板

修改 app.py

复制代码
from flask import Flask, render_template
from datetime import datetime

app = Flask(__name__)

@app.route('/hello/<name>')
def hello(name):
    now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    return render_template('index.html', name=name, time=now)

if __name__ == '__main__':
    app.run(debug=True)

访问 /hello/李四,页面将动态显示名字和当前时间。


第五章:处理表单(GET 与 POST)

5.1 创建表单页面

新建 templates/form.html

复制代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>提交表单</title>
</head>
<body>
    <form method="POST">
        <label>姓名:<input type="text" name="username" required></label><br><br>
        <button type="submit">提交</button>
    </form>
</body>
</html>

5.2 处理表单请求

修改 app.py

复制代码
from flask import Flask, render_template, request, redirect, url_for

app = Flask(__name__)

@app.route('/form', methods=['GET', 'POST'])
def form():
    if request.method == 'POST':
        username = request.form['username']
        return f"你好,{username}!表单已提交。"
    return render_template('form.html')

if __name__ == '__main__':
    app.run(debug=True)
  • methods=['GET', 'POST'] 允许两种请求方式
  • request.form 获取 POST 提交的数据

访问 /form,填写并提交表单,即可看到结果。


第六章:集成数据库(SQLite + SQLAlchemy)

我们将使用 SQLite (无需单独安装)和 SQLAlchemy(ORM 工具)。

6.1 安装依赖

复制代码
pip install flask-sqlalchemy

6.2 配置数据库

修改 app.py

复制代码
from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///todos.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

# 定义模型
class Todo(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    done = db.Column(db.Boolean, default=False)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)

    def __repr__(self):
        return f'<Todo {self.title}>'

6.3 创建数据库表

在 Python 交互环境中执行一次(或写初始化脚本):

复制代码
# 在 app.py 同目录下运行:
# python
# >>> from app import db
# >>> db.create_all()

或者在 app.py 末尾临时添加(仅开发用):

复制代码
with app.app_context():
    db.create_all()

注意:正式项目应使用迁移工具(如 Flask-Migrate)。


第七章:完整项目 ------ Web 版待办事项

我们将把上一篇的命令行待办事项升级为 Web 应用。

7.1 主页面:显示任务列表

复制代码
@app.route('/')
def index():
    todos = Todo.query.all()
    return render_template('index.html', todos=todos)

7.2 创建模板 templates/index.html

复制代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>待办事项</title>
    <style>
        .done { text-decoration: line-through; color: #999; }
    </style>
</head>
<body>
    <h1>我的待办事项</h1>

    <!-- 添加任务表单 -->
    <form method="POST" action="/add">
        <input type="text" name="title" placeholder="输入新任务" required>
        <button type="submit">添加</button>
    </form>

    <hr>

    <!-- 任务列表 -->
    {% for todo in todos %}
        <div>
            {% if todo.done %}
                <span class="done">{{ todo.title }}</span>
            {% else %}
                <span>{{ todo.title }}</span>
            {% endif %}
            <a href="/toggle/{{ todo.id }}">切换</a>
            <a href="/delete/{{ todo.id }}" onclick="return confirm('确定删除?')">删除</a>
        </div>
    {% endfor %}
</body>
</html>

7.3 添加任务

复制代码
@app.route('/add', methods=['POST'])
def add():
    title = request.form['title']
    new_todo = Todo(title=title)
    db.session.add(new_todo)
    db.session.commit()
    return redirect(url_for('index'))

7.4 切换完成状态

复制代码
@app.route('/toggle/<int:id>')
def toggle(id):
    todo = Todo.query.get_or_404(id)
    todo.done = not todo.done
    db.session.commit()
    return redirect(url_for('index'))

7.5 删除任务

复制代码
@app.route('/delete/<int:id>')
def delete(id):
    todo = Todo.query.get_or_404(id)
    db.session.delete(todo)
    db.session.commit()
    return redirect(url_for('index'))

7.6 完整 app.py 代码

复制代码
from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///todos.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

class Todo(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    done = db.Column(db.Boolean, default=False)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)

@app.route('/')
def index():
    todos = Todo.query.all()
    return render_template('index.html', todos=todos)

@app.route('/add', methods=['POST'])
def add():
    title = request.form['title']
    new_todo = Todo(title=title)
    db.session.add(new_todo)
    db.session.commit()
    return redirect(url_for('index'))

@app.route('/toggle/<int:id>')
def toggle(id):
    todo = Todo.query.get_or_404(id)
    todo.done = not todo.done
    db.session.commit()
    return redirect(url_for('index'))

@app.route('/delete/<int:id>')
def delete(id):
    todo = Todo.query.get_or_404(id)
    db.session.delete(todo)
    db.session.commit()
    return redirect(url_for('index'))

if __name__ == '__main__':
    with app.app_context():
        db.create_all()
    app.run(debug=True)

第八章:运行项目

  1. 确保已安装 Flask 和 Flask-SQLAlchemy

  2. 执行:

    复制代码
    python app.py
  3. 添加、切换、删除任务,数据将持久化保存在 todos.db

相关推荐
寻星探路4 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
ValhallaCoder7 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
执笔论英雄7 小时前
【大模型学习cuda】入们第一个例子-向量和
学习
wdfk_prog7 小时前
[Linux]学习笔记系列 -- [drivers][input]input
linux·笔记·学习
猫头虎8 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
八零后琐话8 小时前
干货:程序员必备性能分析工具——Arthas火焰图
开发语言·python
Gary Studio9 小时前
rk芯片驱动编写
linux·学习
mango_mangojuice9 小时前
Linux学习笔记(make/Makefile)1.23
java·linux·前端·笔记·学习
青春不朽5129 小时前
Scrapy框架入门指南
python·scrapy