Timeout and rate-limit failures now show a warning message to the user. Timeout increased to 10s. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
35 lines
1.1 KiB
Python
35 lines
1.1 KiB
Python
import requests
|
|
from django.conf import settings
|
|
|
|
_BASE = 'https://perenual.com/api'
|
|
|
|
|
|
class PerenualError(Exception):
|
|
pass
|
|
|
|
|
|
def search_species(query):
|
|
"""Query Perenual species-list endpoint.
|
|
|
|
Returns list of result dicts on success.
|
|
Raises PerenualError if the API is unreachable or rate-limited.
|
|
Returns [] if no API key is configured.
|
|
"""
|
|
if not settings.PERENUAL_API_KEY:
|
|
return []
|
|
try:
|
|
resp = requests.get(
|
|
f'{_BASE}/species-list',
|
|
params={'q': query, 'key': settings.PERENUAL_API_KEY},
|
|
timeout=10,
|
|
)
|
|
resp.raise_for_status()
|
|
return resp.json().get('data', [])
|
|
except requests.Timeout:
|
|
raise PerenualError('Perenual API timed out — try again in a moment.')
|
|
except requests.HTTPError as e:
|
|
if e.response is not None and e.response.status_code == 429:
|
|
raise PerenualError('Perenual API rate limit reached — try again later.')
|
|
raise PerenualError(f'Perenual API error ({e.response.status_code if e.response else "?"}).')
|
|
except Exception:
|
|
raise PerenualError('Could not reach Perenual API.')
|