Flask注册页面数据存为NULL及BadRequestKeyError问题求助
Flask注册页面数据存入SQLite失败问题解决
问题现象
开发Flask注册页面用于收集用户的姓名(name)、姓氏(surname)、邮箱(email)、密码(password)信息并存入SQLite数据库(使用DB Browser管理),但出现两个核心问题:
- 提交表单后触发
werkzeug.exceptions.BadRequestKeyError: 400 Bad Request错误 - 数据库中最终存入的数据全部为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属性。这会导致两个后果:
- Flask的
request.form无法找到对应字段,直接访问request.form['name']这类键会触发400 Bad Request错误 - 若错误未被捕获,后续数据库插入操作会因变量未正确赋值,最终存入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
相关产品推荐
相关产品推荐

