La vista del matraz muestra el error 400 en lugar de la plantilla con el formulario

Estoy intentando mostrar una página con un formulario y luego agregar un Player a la base de datos cuando se envía el formulario. Sin embargo, no puedo ver el formulario porque el navegador siempre muestra un error de 400 Bad Request erróneas. Otras publicaciones indican que esto podría deberse a que el nombre de la entrada del formulario no coincide con la clave que recibí de request.form , pero todas mis claves coinciden. ¿Por qué me sale este error?

  {{ form.hidden_tag() }}     
 @app.route('/addplayer', methods=['GET', 'POST']) def addplayer(): connect('basketball_contracts', host='localhost', port=27017) n = request.form['name'] a = request.form['available'] post= Post( name=n, available=a ) post.tags = ['test'] post.save() return render_template('addplayer.html', form=form) 

Tu vista acepta solicitudes GET y POST . request.form solo se completa en POST . Si intenta acceder a una clave que no existe, se genera un error 400. Ninguna clave existirá cuando GET la página inicialmente.

El patrón común para esto es guardar el código que requiere request.form en un bloque if request.method == 'POST' . Devuelva un redireccionamiento después de manejar la solicitud POST ; de lo contrario, devuelva la plantilla renderizada.

 from flask import url_for, redirect, render_template @app.route('/addplayer', methods=['GET', 'POST']) def addplayer(): if request.method == 'POST': Post( name=request.form['name'], available=request.form['available'] ).save() return redirect(url_for('index')) return render_template('addplayer.html') 

Como parece que está usando Flask-WTF, puede usar el método validate_on_submit del formulario en lugar del method de verificación. En ese caso, también puede acceder a los datos a través de la instancia del formulario y usar el formulario para representar las entradas para usted.

 from flask import url_for, redirect, render_template @app.route('/addplayer', methods=['GET', 'POST']) def addplayer(): form = AddPlayerForm() if form.validate_on_submit(): Post( name=form.name.data, available=form.available.data ).save() return redirect(url_for('index')) return render_template('addplayer.html', form=form) 
 
{{ form.hidden_tag() }} {{ form.name.label}} {{ form.name }}
{{ form.available.label }} {{ form.available }}