python - render_template - Error de envío de formulario, Frasco
python flask mega tutorial (2)
Hay formulario con dos <input type="submit">
. Pero cuando lo envío, la segunda entrega provoca un error.
diseño :
<form action="{{ url_for(''index'') }}" method="post">
<input type="submit" name="add" value="Like">
<input type="submit" name="remove" value="Dislike">
</form>
main.py :
...
if request.method == ''POST'':
if request.form[''add'']:
return redirect(url_for(''index''))
elif request.form[''remove'']:
return redirect(url_for(''index''))
...
Primero enviar (agregar) funciona bien, pero segundo (eliminar) ...:
Solicitud incorrecta El navegador (o proxy) envió una solicitud que este servidor no pudo entender.
¿Cómo puedo solucionar este error?
UPD :
Fue bastante simple: request.form devuelve ImmutableMultiDict:
...
if ''Like'' in request.form.values():
...
elif ''Dislike'' in request.form.values():
...
Como señala @Blubber, el problema es que Flask genera un error HTTP cuando no puede encontrar una clave en los args
y form
diccionarios. Lo que Flask asume de manera predeterminada es que si está solicitando una clave en particular y no está allí, entonces algo quedó fuera de la solicitud y la solicitud completa no es válida.
Hay otras dos buenas formas de lidiar con su situación:
Use el método
.get
request.form
:if request.form.get(''add'', None) == "Like": # Like happened elif request.form.get(''remove'', None) == "Dislike": # Dislike happened
Use el mismo atributo de
name
para ambos elementos de envío:<input type="submit" name="action" value="Like"> <input type="submit" name="action" value="Dislike"> # and in your code if request.form["action"] == "Like": # etc.
Debería comprobar si ''remove''
claves ''add''
y ''remove''
están en el dict de request.form
.
if request.method == ''POST'':
if ''add'' in request.form:
return redirect(url_for(''index''))
elif ''remove'' in request.form:
return redirect(url_for(''index''))
Cuando hace clic en Me gusta , no falla porque se cumple la primera condición y, por lo tanto, nunca se comprueba el segundo. Pero si se hace clic en el botón Dislike, esa primera condición generará una excepción KeyError
porque request.form
no contiene una clave llamada ''add''
.