2012-08-19 19 views
10

Estoy escribiendo una aplicación Web utilizando frasco, pitón y HTML. Mi problema es que la primera vez que se carga la una página web, me sale el siguiente errorSolicitud incorrecta de error con el frasco, Python, HTML, comportamiento inusual con la inicialización flask.request.form

Bad Request El navegador (o poder) enviaron una solicitud para que este servidor no podía comprender.

soy capaz de conseguir que la página cargue con el tiempo por "engañar" primera ejecutarlo sin ningún flask.request.form llamadas, y luego volver a ponerlos en (detalles a continuación). Algo debe estar saliendo mal en mi inicialización. Soy nuevo en flask y usando python con HTML.

Supongamos que estoy trabajando desde un directorio llamado example. Tengo un script en Python llamada test.py y una plantilla HTML llamada test.html con la siguiente estructura de directorios:

\example\test.py 
\example\templates\test.html 

Mi script en Python test.py es:

import sys 
import flask, flask.views 
app = flask.Flask(__name__) 
app.secret_key = "bacon" 

class View(flask.views.MethodView): 
    def get(self): 
     result = flask.request.form['result'] 
     return flask.render_template('test.html', result=result) 
#  return flask.render_template('test.html') 
    def post(self): 
     return self.get() 

app.add_url_rule('/', view_func=View.as_view('main'), methods=['GET', 'POST']) 
app.debug = True 
app.run() 

y mi HTML en test.html es

<html> 
    <head> 
    </head> 
    <body> 
     <form action="/" method="post"> 
      Enter something into the box: 
      <input type="text" name="result"/><br> 
      <input type="submit" value="Execute!"/> 
     </form> 
    </body> 
</html> 

Pasos para reproducir el error

1: Ejecutar el script test.py, y abrir la URL en un navegador

Running on http://127.0.0.1:5000/ 

Debería ver el siguiente error

Bad Request El navegador (o poder) envió una solicitud para que este servidor no pudo entender.

2: Comente las 2 primeras líneas de la función def get(self) y elimine la tercera línea de la función def get(self) modo que test.py se parece a esto

import sys 
import flask, flask.views 
app = flask.Flask(__name__) 
app.secret_key = "bacon" 

class View(flask.views.MethodView): 
    def get(self): 
#  result = flask.request.form['result'] 
#  return flask.render_template('test.html', result=result) 
     return flask.render_template('test.html') 
    def post(self): 
     return self.get() 

app.add_url_rule('/', view_func=View.as_view('main'), methods=['GET', 'POST']) 
app.debug = True 
app.run() 

3: Actualizar la URL, y verá que las cosas funcionen (aunque en última instancia quiero poder devolver el valor de result

4: Ahora, cambie las líneas que están comentadas de nuevo. Es decir, descomente las primeras 2 líneas de la función def get(self) y comience t la tercera línea de la función def get(self) modo que test.py se parece a esto

import sys 
import flask, flask.views 
app = flask.Flask(__name__) 
app.secret_key = "bacon" 

class View(flask.views.MethodView): 
    def get(self): 
     result = flask.request.form['result'] 
     return flask.render_template('test.html', result=result) 
#  return flask.render_template('test.html') 
    def post(self): 
     return self.get() 

app.add_url_rule('/', view_func=View.as_view('main'), methods=['GET', 'POST']) 
app.debug = True 
app.run() 

5: Actualizar la URL y ahora se ven las cosas van a trabajar si lo deseas.

Esto es solo un ejemplo de juguete que ilustra el verdadero problema que presenta este extraño comportamiento de cómo tengo que "engañar" a mi navegador para que me muestre esta página web.El

Respuesta

27

El problema aquí es que está intentando acceder a las variables ed POST en un método que solo manejará las solicitudes GET. Cuando intenta acceder a una cadena de consulta o parámetro POST que no está establecido en Flask will, by default, raise a BadRequest error (porque está solicitando algo que la persona que accedió a la página no proporcionó).

¿Qué ocurre si la clave no existe en el atributo de formulario? En ese caso, se genera un KeyError especial. Puede atraparlo como un KeyError estándar, pero si no lo hace, se muestra una página de error HTTP 400 Solicitud incorrecta. Entonces, para muchas situaciones, no tienes que lidiar con ese problema.

Si necesita acceder a una variable de cualquiera request.args (GET) o request.form (POST) y no lo hace necesidad que sea configurada utilizar el método get para obtener el valor si está allí (o . None si no se establece

# Will default to None 
your_var = request.form.get("some_key") 

# Alternately: 
your_var = request.form.get("some_key", "alternate_default_value") 

Aquí es una forma alternativa de estructurar su código:

import sys 
import flask, flask.views 

app = flask.Flask(__name__) 

app.secret_key = "bacon" 
app.debug = True 


class View(flask.views.MethodView): 
    def get(self): 
     """Enable user to provide us with input""" 
     return self._default_actions() 

    def post(self): 
     """Map user input to our program's inputs - display errors if required""" 
     result = flask.request.form['result'] 
     # Alternately, if `result` is not *required* 
     # result = flask.request.form.get("result") 
     return self._default_actions(result=result) 

    def _default_actions(self, result=None): 
     """Deal with the meat of the matter, taking in whatever params we need 
     to get or process our information""" 
     if result is None: 
      return flask.render_template("test.html") 
     else: 
      return flask.render_template("test.html", result=result) 

app.add_url_rule('/', view_func=View.as_view('main'), methods=['GET', 'POST']) 

if __name__ == "__main__": 
    app.run() 
+0

impresionantes Gracias por la gran explicación ! – erin

+0

Esta es una gran explicación sobre cómo implementar valores de solicitud predeterminados en Flask. Gracias. – earthmeLon

+0

Estoy ejecutando la aplicación Flask en un servidor Apache. No importa lo que haga, recibo un error de solicitud incorrecta. 'El navegador envió una respuesta', etc. ¿Tiene algo que ver con mi servidor? –

Cuestiones relacionadas