第一章:安装 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)
第八章:运行项目
-
确保已安装 Flask 和 Flask-SQLAlchemy
-
执行:
python app.py -
添加、切换、删除任务,数据将持久化保存在
todos.db中