【问题标题】:Python Flask JSON KeyErrorPython Flask JSON KeyError
【发布时间】:2020-10-03 14:30:20
【问题描述】:

我正在尝试从另一个 API 服务获取一些 JSON 数据并更新我的烧瓶应用程序的数据库,同时用户可以下载一些 PDF 文件。该 API 有 3 个密钥。第一个是“状态”。当该“状态”键具有"success" 值时,它也具有其他两个键和值。然后应用程序正常工作,没有错误。 但是当“状态”具有'fail' 值时,其他两个键和值将不存在。我写了一个异常,但它不起作用并以 KeyError 告终,KeyError: 'country'

这是我的代码。


    @app.route("/pdf/download/<int:pdf_id>", methods=['GET', 'POST'])
    def downloads(pdf_id):
        current_ip = someIPaddress
        req = requests.request("GET", 'http://anotherwebsite.com/json/someIPaddress?fields=169')
        req_two = req.json()
        status = req_two['status']
        country = req_two['country']
        city = req_two['city']
        download_file = Pdf_info.query.get(pdf_id)
        if Ipaddress.query.filter(Ipaddress.ip_address == current_ip, Ipaddress.pdfid == pdf_id).first():
            try:
                return send_from_directory("pdfs/pdf/", filename=download_file.file_location_name, as_attachment=True)
            except FileNotFoundError:
                abort(404)
        else:
            if status == "success":
                ip_adding = Ipaddress(ip_address=current_ip, pdfid=pdf_id, downtime=datetime.utcnow(), country=country, location=city)
                db.session.add(ip_adding)
                db.session.commit()
                try:
                    return send_from_directory("pdfs/pdf/", filename=download_file.file_location_name, as_attachment=True)
                except FileNotFoundError:
                    abort(404)
            else:
                ip_adding = Ipaddress(ip_address=current_ip, pdfid=pdf_id, downtime=datetime.utcnow())
                db.session.add(ip_adding)
                db.session.commit()
                try:
                    return send_from_directory("pdfs/pdf/", filename=download_file.file_location_name, as_attachment=True)
                except FileNotFoundError:
                    abort(404)

有人可以解释为什么这不起作用或请提及解决方案吗?

【问题讨论】:

    标签: python json flask keyerror


    【解决方案1】:

    您正在尝试获取:

    country = req_two['country']
    city = req_two['city']
    

    在您测试以下输出之前:

    status = req_two['status']
    

    所以如果statusfail 那么country=city= 将失败。

    用途:

    country = req_two.get('country')
    city = req_two.get('city')
    

    如果找不到密钥,则返回 None,而不是之后返回 ``KeyError. It also allows you test the countryandcity` 变量。

    【讨论】:

    • 非常感谢@Adrian Klaver,您的解决方案奏效了。
    猜你喜欢
    • 2015-04-12
    • 2021-09-28
    • 2021-03-22
    • 2020-12-27
    • 1970-01-01
    • 2021-07-21
    • 2022-08-10
    • 2018-12-15
    • 1970-01-01
    相关资源
    最近更新 更多