使用flask.request.form,烧瓶,python,HTML,异常初始化行为的错误请求错误

时间:2012-08-19 02:55:10

标签: python html flask bad-request

我正在使用flask,python和HTML编写一个web应用程序。我的问题是,第一次加载网页时,我收到以下错误

  

错误请求浏览器(或代理)发送了此服务器的请求   无法理解。

我可以通过“欺骗”首先运行它而不进行任何flask.request.form调用,然后将它们重新放入(下面的详细信息),以便最终加载页面。我的初始化必定会出错。我是flask的新用户,python使用HTML

假设我正在使用名为example的目录。我有一个名为test.py的python脚本和一个名为test.html的HTML模板,其中包含以下目录结构:

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

我的python脚本test.py是:

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

test.html中的HTML

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

重现错误的步骤

1:运行test.py脚本,然后在浏览器中打开URL

Running on http://127.0.0.1:5000/

您应该会看到以下错误

  

错误请求浏览器(或代理)发送了此服务器的请求   无法理解。

2:注释def get(self)函数的前两行并取消注释def get(self)函数的第3行,以便test.py看起来像这样

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:刷新网址,你会发现事情有效(尽管我最终希望能够返回result

的值

4:现在,再次切换注释掉的行。即,取消注释def get(self)函数的前两行并注释掉def get(self)函数的第3行,以便test.py看起来像这样

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:刷新网址,现在您看到内容将按预期运行。

这只是一个玩具示例,说明了真正的问题,表明我必须“欺骗”我的浏览器向我展示这个网页的这种奇怪的行为。在

1 个答案:

答案 0 :(得分:28)

此处的问题是您尝试在仅处理POST请求的方法中访问GET个ed变量。当您尝试访问未设置Flask will, by default, raise a BadRequest error的查询字符串或POST参数时(因为您要求查看该页面的人没有提供的内容)。

  

如果表单属性中不存在键,会发生什么?在这种情况下,会引发一个特殊的KeyError。您可以像标准KeyError一样捕获它,但如果不这样做,则会显示HTTP 400错误请求错误页面。因此,在许多情况下,您不必处理该问题。

如果您需要从request.args(GET)或request.form(POST)访问变量,并且您没有需要来设置它,请使用{{ 1}}获取值的方法(如果没有设置,则为get

None

以下是构建代码的另一种方法:

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

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