Handle Wikidata API errors with proper HTTP responses (429, 503)
Also retry on RequestException and raise QueryError on non-200 responses. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
d75d617d11
commit
1442620ece
2 changed files with 15 additions and 2 deletions
12
lookup.py
12
lookup.py
|
|
@ -10,6 +10,7 @@ import traceback
|
|||
import typing
|
||||
from time import time
|
||||
|
||||
import requests.exceptions
|
||||
import sqlalchemy.exc
|
||||
import werkzeug.debug.tbtools
|
||||
from flask import Flask, jsonify, redirect, render_template, request, url_for
|
||||
|
|
@ -375,7 +376,16 @@ def index() -> str | Response:
|
|||
return jsonify(coords={"lat": lat, "lon": lon}, error=error_msg)
|
||||
|
||||
needs_commons = request.args.get("needs_commons", "true").lower() != "false"
|
||||
result = lat_lon_to_wikidata(lat, lon, needs_commons=needs_commons)["result"]
|
||||
try:
|
||||
result = lat_lon_to_wikidata(lat, lon, needs_commons=needs_commons)["result"]
|
||||
except (wikidata.QueryError, wikidata.APIResponseError) as e:
|
||||
r = e.r if isinstance(e, wikidata.QueryError) else e.response
|
||||
if r.status_code == 429:
|
||||
extra = {"Retry-After": r.headers["Retry-After"]} if "Retry-After" in r.headers else {}
|
||||
return jsonify(error="Rate limited by Wikidata, please try again later"), 429, extra
|
||||
return jsonify(error=f"Wikidata query failed (HTTP {r.status_code}), please try again later"), 503
|
||||
except requests.exceptions.RequestException:
|
||||
return jsonify(error="Could not connect to Wikidata, please try again later"), 503
|
||||
result.pop("element", None)
|
||||
result.pop("geojson", None)
|
||||
if logging_enabled:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue