This question already has an answer here:
Flask view shows 400 error instead of template with form
                                
                                    (1个答案)
                                
                        
                                2年前关闭。
            
                    
我尝试了几种不同的flask应用程序,每次都遇到以下错误。


  werkzeug.exceptions.BadRequestKeyError
  
  werkzeug.exceptions.HTTPException.wrap..newcls:400错误
  请求:KeyError:'名称'


我不知道为什么。我的安装程序一定有问题,因为在不同的应用程序中会发生相同的事情。我建立了一个非常简单的模型,用最少的代码来演示。如果删除name键,则使用number1键会出现相同的错误。而且我什至找不到任何关于此错误的含义。

app.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['DEBUG'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///flow.sqlite3'

db = SQLAlchemy(app)

from routes import *

if __name__ == '__main__':
    # db.drop_all()
    db.create_all()
    app.run()


route.py

from flask import render_template, request
from app import app, db
from models import Info

@app.route('/', methods=['GET', 'POST'])
def index():
    data = Info(request.form['name'], request.form['number1'], request.form['number2'])
    db.session.add(data)
    db.session.commit()
    return render_template('index.html', data=data)


models.py

from app import db

class Info(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80))
    number1 = db.Column(db.Integer)
    number2 = db.Column(db.Integer)

    def __init__(self, name, number1, number2):
        self.name = name
        self.number1 = number1
        self.number2 = number2


index.html

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <form id='basic' action="index.html" method="post">
      <label for="name">Name:</label>
      <input type="text" name="name" placeholder="Name">
      <label for="number1">Number 1:</label>
      <input type="number" name="number1">
      <label for="number2">Number 2:</label>
      <input type="number" name="number2">
      <button id='btn_submit' type="submit" name="button">Submit</button>
    </form>
  </body>
</html>

最佳答案

首次加载页面时,没有request.form词典,这就是为什么会出现键错误的原因。您需要编写一条if语句来检查是否提交了表单或是否第一次加载了页面。

from flask import redirect, url_for

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
      data = Info(request.form['name'], request.form['number1'], request.form['number2'])
      db.session.add(data)
      db.session.commit()
      return redirect(url_for('index'))
    else:
      return render_template('index.html')

09-20 22:38