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

相关推荐
我材不敲代码1 小时前
Python实现打包贪吃蛇游戏
开发语言·python·游戏
0思必得03 小时前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
韩立学长3 小时前
【开题答辩实录分享】以《基于Python的大学超市仓储信息管理系统的设计与实现》为例进行选题答辩实录分享
开发语言·python
qq_192779873 小时前
高级爬虫技巧:处理JavaScript渲染(Selenium)
jvm·数据库·python
u0109272713 小时前
使用Plotly创建交互式图表
jvm·数据库·python
爱学习的阿磊3 小时前
Python GUI开发:Tkinter入门教程
jvm·数据库·python
Imm7774 小时前
中国知名的车膜品牌推荐几家
人工智能·python
tudficdew4 小时前
实战:用Python分析某电商销售数据
jvm·数据库·python
sjjhd6524 小时前
Python日志记录(Logging)最佳实践
jvm·数据库·python