【问题标题】:Flask: BadRequestKeyError: 400 Bad Request: The browser (or proxy) sent a request that this server could not understandFlask: BadRequestKeyError: 400 Bad Request: 浏览器(或代理)发送了一个服务器无法理解的请求
【发布时间】:2021-02-19 10:27:31
【问题描述】:

我为我的生日提醒应用程序创建了一个编辑视图,并且之前工作过,每当我链接到这个编辑视图时,我都会收到一个关键错误。我检查了 get_Gift 函数返回的对象,并且存在关键字段。此外,使用多个字段创建的 HTML 表单包含错误中指示的字段。

收到的错误是:

werkzeug.exceptions.BadRequestKeyError: 400 Bad Request: 浏览器(或代理)发送了此服务器无法理解的请求。 KeyError: 'giftName'

我确定我遗漏了一些非常明显的东西,但我目前看不到它。应该使用从相应 MongoDB 文档中检索到的值来渲染 HTML。 任何帮助将不胜感激。

Python 脚本

def get_gift(gid):
    query = {"giftId":gid}
    gift = Gift.viewGift(query)   
    if gift is None:
        abort(404, "Gift id {0} doesn't exist.".format(gid))

    return gift


@ct.route('/<giftId>/editGifts', methods=('GET','POST'))
def editGifts(giftId):
    gft = get_gift(giftId)
    
    if request.method == 'POST':
        giftId = giftId
        giftName = request.form['giftName']
        giftDate = datetime.strptime(request.form['giftDate'],'%Y-%m-%d')
        giftDesc = request.form['giftDesc']
        giftType = request.form['giftType']
        giftCategory = request.form['giftCategory']
        giftSentiment = request.form['giftSentiment']
        giftRelInterest = list(str(request.form['giftRelInterest']).split(','))

        error = None

        gft = Gift(giftName,giftDate,giftDesc,giftType,giftCategory,giftSentiment,giftRelInterest,giftId)

        if giftName is None:
            error = 'Please provide a gift name'
        
        if giftDate is None:
            error = 'Please enter the date of gift purchase'

        if giftType is None:
            error = 'Please select a gift type'

        if giftCategory is None:
            error = 'Please choose a gift category'

        if error is not None:
            flash(error)
        else:

            query = {"giftId":giftId}
            giftData = {"$set": {
                "giftName": giftName,
                "giftDate": giftDate,
                "giftDesc": giftDesc,
                "giftType": giftType,
                "giftCategory": giftCategory,
                "giftSentiment": giftSentiment,
                "giftRelInterest": giftRelInterest
            }}

            Gift.updateGift_one(query,giftData)
            return redirect(url_for('contact.index'))

        gCategories = [{'name':'Books'},{'name':'Electronics/Computers'},{'name':'Home & Garden'},{'name':'Sports'},{'name':'Travel/Hospitality'},{'name':'Film/Theatre'},{'name':''},{'name':''}]
        gTypes = [{'name':'Activity/Experience'},{'name':'Alcohol/Beverage'},{'name':'Virtual'},{'name':''},{'name':''},{'name':''},{'name':''},{'name':''}]
        gSentiment = [{'name':'Positive'},{'name':'Neutral'},{'name':'Negative'},{'name':'Unknown'}]
        gRelInt = [{'name':'Sports'},{'name':'Reading'},{'name':'Travel'},{'name':'Cooking'},{'name':'Art'},{'name':'Gardening'},{'name':'Gym'},{'name':'Film/Theatre'},{'name':'Music'},{'name':'DIY'}]

        return render_template('gifts/editGifts.html', gft=gft, gCategories=gCategories, gTypes=gTypes, gSentiment=gSentiment, gRelInt=gRelInt)
    else:
        return render_template('gifts/viewGifts.html')

HTML 表单

{% extends 'base.html' %}

{% block header %}
<div>
    <h1>{% block title %}Edit Gift{% endblock %}</h1>
</div>
{% endblock %}

{% block content %}
<div  class="ui form">
    <fieldset>
    <form method = "post">
    <p>
        <label for="giftName">Gift Name *</label>
        <input name="giftName" id="giftName"  value="{{ request.form['giftName'] or gft['giftName'] }}" required>
    </p>
    <p>
        <label for="giftDate">Purchase Date *</label>
        <input type="date" name="giftDate" id="giftDate" value="{{ request.form['giftDate'] or gft['giftDate'] }}" required>
    </p>
    <p>
        <label for="giftDesc">Description</label>
        <textarea name="giftDesc" id="giftDesc" rows="4" cols="50" value="{{ request.form['giftDesc']  or gft['giftDesc'] }}"></textarea>
    </p>
    <p>
        <label for="giftType">Type *</label>
        <select name="giftType" id="giftType" required>
            {% for gTy in gTypes %}
                <option selected="" value="{{ gTy.name }}">{{ gTy.name  or gft['giftType'] }}</option>
            {% endfor %}
        </select>
    </p>
    <p>
        <label for="giftCategory">Category *</label>
        <select name="giftCategory" id="giftCategory" required>
            {% for gC in gCategories %}
                <option selected="Unknown" value="{{ gC.name }}">{{ gC.name  or gft['giftCategory']}}</option>
            {% endfor %}
        </select>
    </p>
    <p>
        <label for="giftSentiment">Sentiment</label>
        <select name="giftSentiment" id="giftSentiment">
            {% for gSen in gSentiment %}
                <option selected="Unknown" value="{{ gSen.name }}">{{ gSen.name  or gft['giftSentiment'] }}</option>
            {% endfor %}
        </select>
    </p>
    <p>
        <label for="giftRelInterest">Related Interests</label>
        <select name="giftRelInterest" id="giftRelInterest" size=5 multiple>
            {% for gRI in gRelInt %}
                <option  value="{{ gRI.name }}">{{ gRI.name  or gft['giftRelInterest'] }}</option>
            {% endfor %}
        </select>
        
    </p> 
    <hr>
    <p><tr>
        <td><input type="submit" value="Save"></td>
        <td><input type="reset" value="Reset"></td>
        <td><input type="submit" value="Cancel" onclick="history.back()"></td>
        </tr>
    </p>
    <hr>
</fieldset>
</form>
</div>
{% endblock %}

【问题讨论】:

    标签: html python-3.x forms flask pymongo


    【解决方案1】:

    对我来说没有什么可疑的......该错误伴随着整个跟踪,应该指出它的确切来源。 此外,如果它实际上是 GET 请求 - viewGifts.html 似乎很奇怪,因为它没有传递任何参数。

    【讨论】:

      【解决方案2】:

      当你得到一个带有request.form['key'] 的表单值时,如果request.form 中不存在该键,Flask 将引发一个werkzeug.exceptions.BadRequestKeyError 异常,就像你得到的一样:

      werkzeug.exceptions.BadRequestKeyError: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand. KeyError: 'giftName'
      

      它只是告诉您 giftName 的密钥在 request.form 中不存在。 就像你用 dict 做的那样,你可以将所有的request.form[key] 替换为request.form.get('key'),然后如果键不存在,你将得到None 作为默认值。

      【讨论】:

        猜你喜欢
        • 2020-06-11
        • 2020-10-17
        • 2020-03-19
        • 1970-01-01
        • 2021-12-04
        • 2021-06-04
        • 2018-04-27
        • 1970-01-01
        • 2020-10-17
        相关资源
        最近更新 更多