欢迎光临
我们一直在努力

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)


第八章:运行项目

  • 确保已安装 Flask 和 Flask-SQLAlchemy
  • 执行: python app.py
  • 添加、切换、删除任务,数据将持久化保存在 todos.db 中
  • 赞(0)
    未经允许不得转载:171主机测评 » Python 学习教程(第2篇):用 Flask 开发你的第一个 Web 应用
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址