如何用原生Python接收HTML表单数据并写入MySQL数据库?
用原生Python实现表单数据接收与数据库存储
当然可以用原生Python实现,无需依赖Flask这类框架,核心是用http.server模块搭建HTTP服务器,配合内置的sqlite3模块完成数据存储,以下是完整实现步骤:
一、完整代码实现
from http.server import BaseHTTPRequestHandler, HTTPServer import cgi import sqlite3 # 自定义请求处理器,处理GET和POST请求 class FormHandler(BaseHTTPRequestHandler): # 处理GET请求,返回注册表单页面(如果需要对接自己的前端,可忽略这部分) def do_GET(self): self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers() # 简单的注册表单示例 form_html = """ <html> <body> <h1>用户注册</h1> <form method="post" action="/"> 用户名: <input type="text" name="username" required><br> 邮箱: <input type="email" name="email" required><br> <input type="submit" value="提交注册"> </form> </body> </html> """ self.wfile.write(form_html.encode('utf-8')) # 处理POST请求,接收表单数据并写入数据库 def do_POST(self): # 解析表单提交的数据 form_data = cgi.FieldStorage( fp=self.rfile, headers=self.headers, environ={'REQUEST_METHOD': 'POST'} ) # 提取表单字段值 username = form_data.getvalue('username') email = form_data.getvalue('email') if username and email: # 连接SQLite数据库(不存在则自动创建) conn = sqlite3.connect('user_registry.db') cursor = conn.cursor() # 创建用户表(如果不存在) cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, email TEXT NOT NULL UNIQUE)''') # 插入数据 try: cursor.execute("INSERT INTO users (username, email) VALUES (?, ?)", (username, email)) conn.commit() # 返回成功响应 self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers() self.wfile.write(b"<h1>注册成功!</h1>") except sqlite3.IntegrityError: # 处理邮箱重复的情况 self.send_response(400) self.send_header('Content-type', 'text/html') self.end_headers() self.wfile.write(b"<h1>错误:该邮箱已被注册</h1>") finally: conn.close() else: # 字段缺失时返回错误 self.send_response(400) self.send_header('Content-type', 'text/html') self.end_headers() self.wfile.write(b"<h1>错误:用户名或邮箱不能为空</h1>") # 启动服务器的方法 def run_server(port=8000): server_addr = ('', port) http_server = HTTPServer(server_addr, FormHandler) print(f"服务器已启动,访问地址:http://localhost:{port}") try: http_server.serve_forever() except KeyboardInterrupt: http_server.shutdown() print("服务器已停止") if __name__ == '__main__': run_server()
二、核心模块说明
http.server:Python原生HTTP服务模块,通过继承BaseHTTPRequestHandler自定义请求处理逻辑,支持GET/POST等常见请求方法。cgi.FieldStorage:用于解析application/x-www-form-urlencoded类型的表单数据(浏览器表单默认编码),能直接提取字段值。sqlite3:Python内置的轻量级数据库模块,无需额外安装,适合快速实现小型数据存储需求。
三、使用方式
- 将代码保存为
form_receiver.py。 - 运行命令:
python form_receiver.py。 - 浏览器访问
http://localhost:8000即可测试表单提交,数据会自动存入当前目录下的user_registry.db文件。
四、注意事项
- 原生
http.server仅适合开发测试场景,生产环境建议使用Flask、Django等成熟框架——原生模块在性能优化、安全防护(如CSRF、XSS)、路由管理等方面支持有限。 - 如果你的前端表单是独立开发的,只需确保表单的
method设为POST,action指向你的服务器地址,字段名与代码中getvalue的参数一致即可。
内容的提问来源于stack exchange,提问作者cosinusability
相关产品推荐
相关产品推荐

