如何为Python目录HTTP服务器添加仅用Python/HTML实现的Delete请求功能
实现方案
首先明确:HTML原生表单仅支持GET、POST两种请求方法,不用JavaScript的前提下无需强行使用DELETE请求,直接通过POST请求携带操作标识即可实现删除功能,完全符合你的需求。
1. 修改前端表单生成代码
在你现有上传表单的代码(156行)之后,新增删除功能的表单,沿用你当前的代码风格:
line 157 f.write(b"<form ENCTYPE=\"multipart/form-data\" method=\"post\">") line 158 f.write(b"<input name=\"delete_file\" type=\"file\"/>") line 159 f.write(b"<input type=\"hidden\" name=\"action\" value=\"delete\"/>") line 160 f.write(b"<input type=\"submit\" value=\"delete\"/></form>\n")
生成的界面会和你现有的上传按钮风格完全一致,符合你的要求。
2. 修改后端POST请求处理逻辑
找到项目中处理POST请求的代码段,在原有上传逻辑之前新增删除操作的判断:
路径校验逻辑(必须添加,防止越权删除)
先定义允许操作的根目录:
import os ALLOWED_ROOT = os.path.abspath("./your_target_dir") # 替换为你要限制的指定目录路径
处理删除请求
import cgi # 解析POST请求的表单数据 content_type = self.headers.get('Content-Type') boundary = content_type.split('boundary=')[1].encode() form_data = cgi.parse_multipart(self.rfile, {'boundary': boundary}) # 判断是否为删除操作 if form_data.get('action') == ['delete']: delete_file = form_data.get('delete_file', [None])[0] if not delete_file: self.send_response(400) self.end_headers() self.wfile.write(b"No file selected for delete") return # 拼接完整路径并做安全校验 target_path = os.path.abspath(os.path.join(self.cur_dir, delete_file.filename)) # 校验路径是否在允许的根目录下,防止路径遍历攻击 if not target_path.startswith(ALLOWED_ROOT): self.send_response(403) self.end_headers() self.wfile.write(b"Delete not allowed for this path") return # 校验操作对象是文件而非目录 if os.path.isfile(target_path): os.remove(target_path) # 重定向回当前目录页面刷新 self.send_response(303) self.send_header('Location', self.path) self.end_headers() else: self.send_response(400) self.end_headers() self.wfile.write(b"Not a valid file") return # 原有上传逻辑放在这之后即可
补充说明
你提到的requests.delete是客户端发起HTTP DELETE请求的方法,你当前是在服务端实现功能,不需要用到这个方法;JSON交互一般是前后端分离场景使用,你这个纯表单提交的场景也不需要。
内容的提问来源于stack exchange,提问作者JackLalane1
相关产品推荐
相关产品推荐

