Python 烧瓶 JSON KeyError
Python Flask JSON KeyError
我正在尝试从另一个 API 服务获取一些 JSON 数据并更新我的 Flask 应用程序的数据库,同时用户可以下载一些 PDF 文件。 API 有 3 个键。第一个是 'Status'。当 'Status' 键有 "success"
值时,它也有其他两个键和值。然后应用程序可以正常工作而不会出错。
但是当 'Status' 具有 '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)
有人可以解释为什么这不起作用或请提供解决方案吗?
您正在尝试获取:
country = req_two['country']
city = req_two['city']
在您测试输出之前:
status = req_two['status']
所以如果 status
是 fail
那么 country=
和 city=
将失败。
使用:
country = req_two.get('country')
city = req_two.get('city')
如果找不到密钥,那将 return None
而不是之后的 ``KeyError. It also allows you test the
countryand
city` 变量。
我正在尝试从另一个 API 服务获取一些 JSON 数据并更新我的 Flask 应用程序的数据库,同时用户可以下载一些 PDF 文件。 API 有 3 个键。第一个是 'Status'。当 'Status' 键有 "success"
值时,它也有其他两个键和值。然后应用程序可以正常工作而不会出错。
但是当 'Status' 具有 '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)
有人可以解释为什么这不起作用或请提供解决方案吗?
您正在尝试获取:
country = req_two['country']
city = req_two['city']
在您测试输出之前:
status = req_two['status']
所以如果 status
是 fail
那么 country=
和 city=
将失败。
使用:
country = req_two.get('country')
city = req_two.get('city')
如果找不到密钥,那将 return None
而不是之后的 ``KeyError. It also allows you test the
countryand
city` 变量。