首页 > 解决方案 > 检查json dict中的键时Flask(Python)中出现意外的KeyError

问题描述

这是我在 StackOverflow 上的第一个问题,我被 KeyError 困扰了很长时间,所以我希望有人能够找出问题所在。我正在制作一个具有一些 POST 方法(来自 AJAX)的 Flask 应用程序,并且我的 Python 代码行检查密钥是否在字典 if 'delete' in data中给了我一个 KeyError。我尝试打印,但它也没有打印我的输出,这很奇怪。这是 Python 代码:

def index():
    if request.method == 'POST':
        if 'addItem' in request.form:
            # Do stuff

        elif request.get_json():
            data = request.get_json()
            print(data) # This is not printing even though I can see the object in Chrome devtools
            
            if 'delete' in data: # This is the line throwing the error
                to_remove = data['delete']
                session['ingredients'].remove(to_remove)
                session.modified = True
                return redirect('/')
            elif 'name' in data:
                # Do stuff

这是两种 JSON 对象的 Javascript/jQuery:

    $('.save').on('click', function(event) {
        $.ajax({
            type: 'POST',
            url: '/',
            data: JSON.stringify({
                'name': $(event.target).siblings(".edit[name='name']").text(),
                'key_ingred': $(event.target).siblings(".edit[name='key-ingred']").text(),
                'recipe': $(event.target).siblings(".edit[name='recipe']").text(),
                'meal': $(event.target).siblings('b').text(),
                'date': $(event.target).siblings('.date').text()
            }),
            contentType: 'application/json',
            dataType: 'json'
        });
    })

    $('.delete').on('click', function(event){
        $.ajax({
            type: 'POST',
            url: '/',
            data: JSON.stringify({ 'delete': $(event.target).prev().text() }),
            success: function() { $(event.target).parent().remove(); },
            contentType: 'application/json',
            dataType: 'json'
        });
        $(event.target).parent().remove();
    });

编辑:这是完整的回溯消息:

Traceback (most recent call last):
  File "/Project/env/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/Project/env/lib/python3.8/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Project/env/lib/python3.8/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Project/env/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/Project/env/lib/python3.8/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Project/env/lib/python3.8/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Project/app.py", line 40, in index
    if 'delete' in data:
KeyError: 'delete'

我也尝试过使用if data.get('delete') is not None,但也没有用。提前致谢!!!

标签: pythonjqueryjsonajaxflask

解决方案


推荐阅读