什么是 Flask 中的 HTTP 400 错误请求

rea*_*ter 5 python werkzeug flask

什么是 Http 400 错误请求以及导致它发生的原因?

是什么方法,我可以用它来知道keyrequest.form[key]那造成不好的请求,我该如何预防呢?

更新

正如 Gerand 在他的评论中提到的:

当您通过不存在的 http 请求文件时会发生此错误 [....]

为了更清楚,这里是我的示例代码,导致Bad Request

你好.py

# -*- coding: utf-8 -*-
from flask import *
import re

app = Flask(__name__)


@app.route('/', methods=['GET','POST'])
def checkName():

    return render_template('hello.html')

@app.route('/hello',methods=['GET','POST'])
def printName():
    if request.method=='POST':
        username = request.form['username']
        bad_key = request.form['bad_key'] # this key is not exist
        
        return "Hello, ",username

if __name__ == '__main__':

    app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

你好.html

<form class="form-horizontal" action='/hello' method='POST' name="frm_submit">
  <div class="form-group">
    <label for="username" class="col-sm-2 control-label">User Name:</label>
    <div class="col-sm-10">
      <input type="text" class="form-control" id="username" name="username" placeholder="username">
    </div>
  </div>
  <div class="form-group">
    <div class="col-sm-offset-2 col-sm-10">
      <button type="submit" class="btn btn-default">Submit</button>
    </div>
  </div>
</form>
Run Code Online (Sandbox Code Playgroud)

从上面的代码中,浏览器返回时Bad Request - The browser (or proxy) sent a request that this server could not understand.没有给出导致此错误的键的线索。

因此,我可以使用哪种方法来知道key导致此错误的原因,以及如何防止它?

谢谢。

sna*_*erb 2

Flask 使用werkzeug库的MultiDict数据结构来保存 POST 数据。

如果您查看 的实现MultiDict.__getitem__您可以看到如果未找到键,它将BadRequestKeyError以键的名称作为参数引发。因此,您可以检查异常的args属性来获取错误密钥的名称:

from werkzeug.exceptions import BadRequestKeyError

@app.route('/hello', methods=['GET', 'POST'])
def hello():
    if request.method == 'POST':
        username = request.form['username']
        try:
            bad_key = request.form['bad_key']
        except BadRequestKeyError as ex: 
            return 'Unknown key: "{}"'.format(ex.args[0]), 500 
Run Code Online (Sandbox Code Playgroud)

请注意,虽然BadRequestKeyErrors字符串表示形式

400 Bad Request:浏览器(或代理)发送了该服务器无法理解的请求。

响应的状态实际上是

500内部服务器错误

的键request.form对应于所发布的 HTML 页面中表单中标签name的属性。input因此, a通常是由HTML 中的属性与路由中期望的名称BadRequestKeyError不匹配引起的。namerequest.form['some_name']