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

Flask注册页面数据存为NULL及BadRequestKeyError问题求助

Flask注册页面数据存入SQLite失败问题解决

问题现象

开发Flask注册页面用于收集用户的姓名(name)、姓氏(surname)、邮箱(email)、密码(password)信息并存入SQLite数据库(使用DB Browser管理),但出现两个核心问题:

  1. 提交表单后触发werkzeug.exceptions.BadRequestKeyError: 400 Bad Request错误
  2. 数据库中最终存入的数据全部为NULL

原代码

HTML代码

<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-iYQeCzEYFbKjA/T2uDLTpkwGzCiq6soy8tYaI1GyVh/UjpbCx/TYkiZhlZB6+fzT" crossorigin="anonymous">
</head>
<body>
    <nav class="navbar navbar-expand-lg bg-light">
        <div class="container-fluid">
        <div class="collapse navbar-collapse" id="navbarNav">
            <ul class="navbar-nav">
                <li class="nav-item">
                    <a class="nav-link" href="/login">Login</a>
                  </li>
            </ul>
        </div>
        </div>
    </nav>
    <div class="container">
      <div class="row">
        <div class="col-sm-9 col-md-7 col-lg-5 mx-auto">
          <div class="card border-0 shadow rounded-3 my-5">
            <div class="card-body p-4 p-sm-5">
              <h5 class="card-title text-center mb-5 fw-light fs-5">Sign up</h5>
              <form method="post" class="m-5">
                  <div class="form-floating mb-3">
                  <input type="text" class="form-control" id="floatingInput1" placeholder="Name"
                         required="required" value="{{ request.form['name'] }}">
                  <label for="floatingInput1">Name</label>
                </div>
                  <div class="form-floating mb-3">
                  <input type="text" class="form-control" id="floatingInput2" placeholder="Surname"
                         required="required" value="{{ request.form['surname'] }}">
                  <label for="floatingInput2">Surname</label>
                </div>
                <div class="form-floating mb-3">
                  <input type="email" class="form-control" id="floatingInput3" placeholder="name@example.com"
                  required="required" value="{{ request.form['email'] }}">
                  <label for="floatingInput3">Email</label>
                </div>
                <div class="form-floating mb-3">
                  <input type="password" class="form-control" id="floatingPassword" placeholder="Password"
                  required="required" value="{{ request.form['password'] }}">
                  <label for="floatingPassword">Password</label>
                </div>

                <div class="form-check mb-3">
                  <input class="form-check-input" type="checkbox" value="" id="rememberPasswordCheck">
                  <label class="form-check-label" for="rememberPasswordCheck">
                    Remember password
                  </label>
                </div>
                <div class="d-grid">
                  <button class="btn btn-primary btn-login text-uppercase fw-bold" type="submit">Registrati</button>
                </div>
                  <div class="text-center">

      </div>
              </form>
            </div>
          </div>
        </div>
      </div>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-u1OknCvxWvY5kfmNBILK2hRnQC3Pr17a+RTT6rIHI7NnikvbZlHgTPOOmMi466C8" crossorigin="anonymous"></script>
</body>
</html>

Python代码

import sqlite3

from flask import Flask, render_template, request, redirect

app = Flask(__name__)

def connect_db():
    connection = sqlite3.connect('users.db')
    connection.row_factory = sqlite3.Row
    return connection

@app.route('/')
def index():
    connection = connect_db()
    posts = connection.execute('SELECT * FROM posts').fetchall()
    connection.close()
    return render_template('index.html', posts=posts)

@app.route('/login')
def login():
    return render_template('login.html')

@app.route('/signup', methods=('GET','POST'))
def signup():
    if request.method == 'POST':
        name = request.form['name']
        surname = request.form['surname']
        email = request.form['email']
        password = request.form['password']
        connection = connect_db()
        connection.execute(
            'INSERT INTO posts (name, surname, email, password) VALUES (?,?,?,?)',
            (name, surname, email, password)
        )
        connection.commit()
        connection.close()
        return redirect('/')
    return render_template('signup.html')

if __name__ == "__main__":
    from waitress import serve
    serve(app, host="0.0.0.0", port=8080)

问题根源

表单提交时,浏览器依赖input标签的name属性来识别并传递字段数据,但原HTML代码中的所有输入框仅设置了id,未添加对应的name属性。这会导致两个后果:

  1. Flask的request.form无法找到对应字段,直接访问request.form['name']这类键会触发400 Bad Request错误
  2. 若错误未被捕获,后续数据库插入操作会因变量未正确赋值,最终存入NULL值

解决方案

给每个输入框添加与字段名一致的name属性,修改后的HTML关键部分如下:

<div class="form-floating mb-3">
  <input type="text" class="form-control" id="floatingInput1" name="name" placeholder="Name"
         required="required" value="{{ request.form['name'] }}">
  <label for="floatingInput1">Name</label>
</div>
<div class="form-floating mb-3">
  <input type="text" class="form-control" id="floatingInput2" name="surname" placeholder="Surname"
         required="required" value="{{ request.form['surname'] }}">
  <label for="floatingInput2">Surname</label>
</div>
<div class="form-floating mb-3">
  <input type="email" class="form-control" id="floatingInput3" name="email" placeholder="name@example.com"
  required="required" value="{{ request.form['email'] }}">
  <label for="floatingInput3">Email</label>
</div>
<div class="form-floating mb-3">
  <input type="password" class="form-control" id="floatingPassword" name="password" placeholder="Password"
  required="required" value="{{ request.form['password'] }}">
  <label for="floatingPassword">Password</label>
</div>

修改后,表单提交时浏览器会正确携带name、surname、email、password字段的数据,Flask能通过request.form获取到用户输入的真实值,数据库插入操作也会存入有效数据,不再出现NULL和400错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:45:49