基于Flask的待办事项应用重构
▎项目来源
原始项目
github.com/BasicTodoApp
- 作者:BeginnerDev2024
- 原博客:《Python Flask入门教程》
- 问题:无数据验证、硬删除风险、无错误处理
▎运行环境
# 基础环境(Python 3.10+)
pip install flask==2.2.3
# 运行命令
python app.py
问题1:未过滤用户输入
# 原代码(app.py:15)
@app.route('/add', methods=['POST'])
def add():
content = request.form['content'] # 直接获取未过滤输入
db.execute("INSERT INTO todos (content) VALUES (?)", (content,))
重构方案:添加表单验证
from flask_wtf import FlaskForm
from wtforms import StringField, validators
class TodoForm(FlaskForm):
content = StringField('内容', [validators.Length(min=1, max=100)])
问题2:硬删除数据
# 原代码(app.py:28)
@app.route('/delete/<int:id>')
def delete(id):
db.execute("DELETE FROM todos WHERE id=?", (id,)) # 直接物理删除
重构方案:软删除设计
ALTER TABLE todos ADD COLUMN is_deleted BOOLEAN DEFAULT 0;
▎重构效果对比
功能点 原版风险 重构后改进
添加事项 可能注入500字超长文本 限制100字符并过滤HTML
删除操作 数据永久丢失 标记删除可恢复
错误处理 直接显示Python错误页面 友好错误提示页面
核心安全代码
# 新增数据验证层(security.py)
def sanitize_input(text):
from bs4 import BeautifulSoup
return BeautifulSoup(text, "lxml").text # 过滤HTML标签
# 软删除实现
@app.route('/delete/<int:id>')
def delete(id):
try:
db.execute("UPDATE todos SET is_deleted=1 WHERE id=?", (id,))
return redirect(url_for('index'))
except Exception as e:
return render_template('error.html', msg="删除失败: "+str(e))
逆向工程总结
1.防御式编程:对所有用户输入添加消毒处理
2.数据保护:用软删除替代物理删除
3.用户体验:增加删除确认对话框

浙公网安备 33010602011771号