title: Getting "werkzeug.exceptions.BadRequestKeyError: 400 Bad Request" Upon Creating Form on Python Flask REST API
body: <p>I'm learning Python Flask and following this course which is teaching me to build a RESTful API with it.</p>
  
  <p>Right now, I'm trying to request information from the user (to submit) using request.form via its '/register' route, however upon testing its POST request with Postman I get <em>raise exceptions.BadRequestKeyError(key)
  werkzeug.exceptions.BadRequestKeyError: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.
  KeyError: 'email'</em>.</p>
  
  <p><a href="https://i.stack.imgur.com/R7RxG.png" rel="nofollow noreferrer">Error as depicted in Postman</a>
  <a href="https://i.stack.imgur.com/XUxA1.png" rel="nofollow noreferrer">POST Request as shown in Postman</a></p>
  
  <p>I have looked at other posts with seemingly similar problems here, but either some of them also incorporate HTML (confusing!) or the solutions proposed seem to suggest .get(), which I have tried but while it prevents the 400 from occurring, it bypasses any form filling (which is not what I want).</p>
  
  <p>Here is the relevant route:</p>
  
  <pre><code>@app.route('/register', methods=['POST'])
  def register():
      email = request.form['email']
      test = User.query.filter_by(email=email).first()
      if test:
          return jsonify(message='That email already exists.'), 409
      else:
          first_name = request.form['first_name']
          last_name = request.form['last_name']
          password = request.form['password']
          user = User(first_name=first_name, last_name=last_name, email=email, password=password)
          db.session.add(user)
          db.session.commit()
          return jsonify(message="User created successfully."), 201
  </code></pre>
  
  <p>Following is all the code used so far in this file; which is called 'app.py' (also has SQLAlchemy, OS, Flask Marshmallow):</p>
  
  <pre><code>from flask import Flask, jsonify, request
  from flask_sqlalchemy import SQLAlchemy
  from sqlalchemy import Column, Integer, String, Float
  import os
  from flask_marshmallow import Marshmallow
  
  
  app = Flask(__name__)
  basedir = os.path.abspath(os.path.dirname(__file__))
  app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'planets.db')
  
  
  db = SQLAlchemy(app)
  ma = Marshmallow(app)
  
  
  @app.cli.command('db_create')
  def db_create():
      db.create_all()
      print('Database created!')
  
  
  @app.cli.command('db_drop')
  def db_drop():
      db.drop_all()
      print('Database dropped!')
  
  
  @app.cli.command('db_seed')
  def db_seed():
      mercury = Planet(planet_name='Mercury',
                       planet_type='Class D',
                       home_star='Sol',
                       mass=2.258e23,
                       radius=1516,
                       distance=35.98e6)
  
      venus = Planet(planet_name='Venus',
                           planet_type='Class K',
                           home_star='Sol',
                           mass=4.867e24,
                           radius=3760,
                           distance=67.24e6)
  
      earth = Planet(planet_name='Earth',
                       planet_type='Class M',
                       home_star='Sol',
                       mass=5.972e24,
                       radius=3959,
                       distance=92.96e6)
  
      db.session.add(mercury)
      db.session.add(venus)
      db.session.add(earth)
  
      test_user = User(first_name='William',
                       last_name='Herschel',
                       email='test@test.com',
                       password='P@ssw0rd')
  
      db.session.add(test_user)
      db.session.commit()
      print('Database seeded!')
  
  
  @app.route('/')
  def hello_world():
      return 'Hello World!'
  
  
  @app.route('/super_simple')
  def super_simple():
      return jsonify(message='Hello from the Planetary API.'), 200
  
  
  @app.route('/not_found')
  def not_found():
      return jsonify(message='That resource was not found'), 404
  
  
  @app.route('/parameters')
  def parameters():
      name = request.args.get('name')
      age = int(request.args.get('age'))
      if age &lt; 18:
          return jsonify(message="Sorry " + name + ", you are not old enough."), 401
      else:
          return jsonify(message="Welcome " + name + ", you are old enough!")
  
  
  @app.route('/url_variables/&lt;string:name&gt;/&lt;int:age&gt;')
  def url_variables(name: str, age: int):
      if age &lt; 18:
          return jsonify(message="Sorry " + name + ", you are not old enough."), 401
      else:
          return jsonify(message="Welcome " + name + ", you are old enough!")
  
  
  @app.route('/planets', methods=['GET'])
  def planets():
      planets_list = Planet.query.all()
      result = planets_schema.dump(planets_list)
      return jsonify(result.data)
  
  
  @app.route('/register', methods=['POST'])
  def register():
      email = request.form['email']
      test = User.query.filter_by(email=email).first()
      if test:
          return jsonify(message='That email already exists.'), 409
      else:
          first_name = request.form['first_name']
          last_name = request.form['last_name']
          password = request.form['password']
          user = User(first_name=first_name, last_name=last_name, email=email, password=password)
          db.session.add(user)
          db.session.commit()
          return jsonify(message="User created successfully."), 201
  
  
  # database models
  class User(db.Model):
      __tablename__ = 'users'
      id = Column(Integer, primary_key=True)
      first_name = Column(String)
      last_name = Column(String)
      email = Column(String, unique=True)
      password = Column(String)
  
  
  class Planet(db.Model):
      __tablename__ = 'planets'
      planet_id = Column(Integer, primary_key=True)
      planet_name = Column(String)
      planet_type = Column(String)
      home_star = Column(String)
      mass = Column(Float)
      radius = Column(Float)
      distance = Column(Float)
  
  class UserSchema(ma.Schema):
      class Meta:
          fields = ('id', 'first_name', 'last_name', 'email', 'password')
  
  
  class PlanetSchema(ma.Schema):
      class Meta:
          fields = ('planet_id', 'planet_name', 'planet_type', 'home_star', 'mass', 'radius', 'distance')
  
  
  user_schema = UserSchema()
  users_schema = UserSchema(many=True)
  
  planet_schema = PlanetSchema()
  planets_schema = PlanetSchema(many=True)
  
  
  if __name__ == '__main__':
      app.run()
  
  </code></pre>
  
  <p>Any insights as to why this error is happening, and how I can fix it while still allowing the user to input the email, first_name, etc fields would be appreciated! </p>
  
  <p>Thanks in advance.</p>