Flask werkzeug.exceptions.BadRequestKeyError [duplicate]

不问归期 提交于 2020-03-21 05:16:45

问题


I've tried several different flask apps and get the following error every time.

werkzeug.exceptions.BadRequestKeyError

werkzeug.exceptions.HTTPException.wrap..newcls: 400 Bad Request: KeyError: 'name'

I can't figure out why. It must be something with my setup because the same thing is happening in different applications. I set up a very simple model with minimal code to demonstrate. If I remove the name key I get the same error with the number1 key. And I can't find anything on what this error even means.

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()

routes.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>

回答1:


When your page is first loaded, there is no request.form dictionary, which is why you get the key error. You need to write an if statement to check if the form was submitted or if the page is being loaded the first time.

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')


来源:https://stackoverflow.com/questions/51700053/flask-werkzeug-exceptions-badrequestkeyerror

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!