我正在使用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:刷新网址,现在您看到内容将按预期运行。
这只是一个玩具示例,说明了真正的问题,表明我必须“欺骗”我的浏览器向我展示这个网页的这种奇怪的行为。在
答案 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")