You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用原生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内置的轻量级数据库模块,无需额外安装,适合快速实现小型数据存储需求。

三、使用方式

  1. 将代码保存为form_receiver.py。
  2. 运行命令:python form_receiver.py。
  3. 浏览器访问http://localhost:8000即可测试表单提交,数据会自动存入当前目录下的user_registry.db文件。

四、注意事项

  • 原生http.server仅适合开发测试场景,生产环境建议使用Flask、Django等成熟框架——原生模块在性能优化、安全防护(如CSRF、XSS)、路由管理等方面支持有限。
  • 如果你的前端表单是独立开发的,只需确保表单的method设为POST,action指向你的服务器地址,字段名与代码中getvalue的参数一致即可。

内容的提问来源于stack exchange,提问作者cosinusability

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:20:39