Что такое неверный запрос HTTP 400 в Flask

Что такое неверный запрос Http 400 и почему это происходит?

Какой метод я могу использовать, чтобы узнать, какие key в request.form[key] вызывают неверный запрос, и как я могу это предотвратить?

Обновлено

Как отметил Геранд в своем комментарии:

Эта ошибка возникает, когда вы запрашиваете файл через 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)

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

Из приведенного выше кода браузер возвращает Bad Request - The browser (or proxy) sent a request that this server could not understand., не давая понять, какой ключ вызывает эту ошибку.

Поэтому, какой метод я могу использовать, чтобы узнать, какие key вызывают эту ошибку, и как я могу ее предотвратить?

Спасибо.


person rean computer    schedule 21.09.2017    source источник
comment
Что ты пытаешься сделать? какие библиотеки вы используете... Пожалуйста, уточните вашу конкретную проблему или добавьте дополнительные сведения, чтобы выделить именно то, что вам нужно. В том виде, в котором он сейчас написан, трудно точно сказать, о чем вы спрашиваете. См. страницу «Как спросить», чтобы получить помощь в разъяснении этого вопроса.   -  person Kaustubh Kallianpur    schedule 21.09.2017
comment
@KaustubhKallianpur, я пытаюсь узнать, в чем причина Error 400 Bad Request в python? как я могу узнать причину и предотвратить это? Благодарю.   -  person rean computer    schedule 21.09.2017
comment
Эта ошибка возникает, когда вы запрашиваете файл через http, который не существует. К питону отношения не имеет.   -  person Gerard    schedule 21.09.2017
comment
Этот ответ может помочь. Если есть что-то еще, нам понадобится ввод кода.   -  person Kaustubh Kallianpur    schedule 21.09.2017
comment
@Gerard Разве это не 404 - Не найдено? 400 относится к поврежденному запросу   -  person    schedule 21.09.2017
comment
@lausek совершенно прав, я как бы озадачился. обычно бывает у меня   -  person Gerard    schedule 21.09.2017
comment
@KaustubhKallianpur, пожалуйста, обратитесь к моему обновленному вопросу. Спасибо   -  person rean computer    schedule 21.09.2017


Ответы (1)


Flask использует структуру данных MultiDict библиотеки werkzeug для хранения данных 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 

Обратите внимание, что хотя BadRequestKeyErrors строковое представление

400 Bad Request: Браузер (или прокси-сервер) отправил запрос, который этот сервер не смог понять.

статус ответа на самом деле

внутренняя ошибка сервера 500

person snakecharmerb    schedule 13.01.2019