基于Flask的待办事项应用重构

news/2025/2/26 18:57:45/文章来源:https://www.cnblogs.com/jay0118/p/18739132

▎项目来源

原始项目
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, validatorsclass 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 BeautifulSoupreturn 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.用户体验‌:增加删除确认对话框

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/890235.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第6章-控件

控件,继承自 System.Windows.Contorl 类 控件分类内容控件:Label/Button/ToolTip/ScrollViewer 带有标题的内容控件:TabItem/GroupBox/Expander 文本控件:Textbox/PasswordBox/RichTextBox 列表控件:ListBox/ComboBox 基于范围的控件:Slider/ProgressBar 日期控件:Calen…

第5章-路由事件

Handler: 处理器 Preview: 预览、这指隧道 Raise: 引发 Bubble: 冒泡 Handled: 已处理理解路由事件 事件路由允许源自某个元素的事件由另一个元素引发。 定义、注册和封装路由事件 public partial class Window1 : Window {// 定义路由事件,必须是 static readonly// 类型 Rou…

mysql 数据目录

前言 简单介绍一下mysql的数据目录。 正文 对于mysql,我们关心的一般是数据部分,那么关心的就是数据目录。 我们查看一下数据目录的位置。 SHOW VARIABLES LIKE datadir看一下数据目录的位置:再对比一下我们数据库的信息:好像除了这个information_schema 好像都有一个目录。 …

三句话生成 P5.js 粒子特效代码,人人都可以做交互式数字艺术

前几天在上海西岸艺术中心的全球开发者先锋大会GDC2025,通义灵码的老朋友-@同济子豪兄受邀参会,并带领大家观看了本届大会两大重磅看点:具身智能人形机器人和 AI 程序员编程写代码。前几天在上海西岸艺术中心的全球开发者先锋大会GDC2025,通义灵码的老朋友-@同济子豪兄受邀…

使用JAVA调用asmx服务,“http://tempuri.org/”有什么作用?

原文链接:https://bbs.csdn.net/topics/392507481 这个是域名 http://tempuri.org/ 是默认的命名空间.如果是web直接引用不需要管,但有时候别人发布改了这个命名,你动态引用就需要改成跟他一样的了.一般情况下有些人发布没改这个,有些注重网站安全的就修改了这个,给你个照片看…

为什么去IOE化的背景下,还有必要学Oracle

很多人都知道有“去IOE化”这个口号,但事实上,有多少人知道是哪一年提出的这个口号吗?有多少人知道去的哪个IOE吗?现在越来越多的国产数据库出现,还有必要学Oracle、考OCP认证吗? 去IOE化 “去IOE化”这个口号早在2008、2009的时候就提出来了,原因是互联网发展需要、成本…

08 梯度消失与梯度爆炸问题

由反向传播原理可知,梯度的计算遵循链式法则。由于网络层数不断加深,梯度的连乘效应可能会导致梯度呈指数形式衰减,又或以指数形式增加。 前者叫做梯度消失,梯度消失导致网络中的早期层几乎不更新,使得网络难以学习到输入数据的有效特征。可能导致网络权重更新非常缓慢,使…

GAMES101 作业三

重要知识点一 布林冯反射模型 漫反射+高光+环境光重要知识点二 通过作业也对空间中的坐标变换认识更清晰了一点,在摄像空间中进行变换是不对的,需要从原来的三维空间进行变换才对,所以会有一个矫正系数 重要知识点三 在计算光线时,要注意计算向量和单位化 不了解的 对于后两…

写一个简单的hexo-tag-plugin:quote

前置教程 [Akilarの糖果屋 - Akilar.top](https://akilar.top/posts/e2bf861f/) 为啥想写一个quote的标签外挂 我最近在写博客的时候,发现好多时候原生的Hexo标签不是很好用,效果如下。 {% tabs Hexo Block Quote, -1 %}没有提供参数,则只输出普通的 blockquote{% blockquot…

搭建DeepSeek-R1平台

前言 大家用到 DeepSeek-R1 时应该会经常出现下面的情况。但凡多问两个问题,不但缓慢,而且容易出现服务器繁忙的问题:今天教大家一种通过API部署的方式,可以体验满血版的DeepSeek-R1,不仅回答快速,而且不会出现服务器繁忙的情况。 注册账号 首先大家要通过下面的方式,先…

No.16 CSS--背景属性

一、CSS常见的背景属性 background-color: aqua; 设置背景颜色background-image: none; 设置背景图片background-position: 0%; 设置背景图片位置background-repeat: no-repeat; 设置背景图片如何重复填充background-size: 0%; …

Mybatis基础06

动态SQL 介绍 什么是动态SQL:动态SQL指的是根据不同的查询条件 , 生成不同的Sql语句. 官网描述: MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,…