Python으로 환율 가져오기
표준 라이브러리로 시작하고 더 많은 제어가 필요하면 requests를 사용하세요. forex-python은 이전 코드에서 옮길 때 임시 인터페이스가 될 수 있습니다.
/v1/latest/USD는 환율, 출처, 관측 시각을 담은 JSON을 반환합니다. 금액 계산에는 Decimal을 사용하세요.
핵심 요점
requests는 인증, timeout, 오류 처리를 단순하게 합니다. forex-python은 마이그레이션 중간 단계의 인터페이스로 사용할 수 있습니다. source, effective_at, data_updated_at을 값과 함께 저장하세요. 과거 데이터는 날짜 endpoint나 /v1/range를 사용하세요. 첫 요청
첫 요청에는 표준 라이브러리만으로 충분합니다. 금액을 계산한다면 JSON 숫자를 Decimal로 읽으세요.
키를 사용하는 requests
서비스에서는 timeout을 설정하고 환경 변수에서 키를 읽은 뒤 HTTP 상태를 확인하고 저장하세요.
forex-python에서 옮기기
forex-python은 자체 제공자를 사용하며 exchangerate.dev에 자동으로 연결되지 않습니다. 마이그레이션 중 익숙한 인터페이스를 유지할 수 있지만 exchangerate.dev의 source와 관측 시각을 버리지 마세요.
과거 데이터 올바르게 다루기
날짜 요청은 해당 날짜에 새 값이 없으면 이전 값이 이어진 결과를 반환할 수 있습니다. /v1/range는 저장된 관측을 반환하고 JSON을 366행 단위로 페이지 처리합니다.
자주 묻는 질문
python · standard librarycopy
import json
from decimal import Decimal
import urllib.request
url = "https://api.exchangerate.dev/v1/latest/USD?symbols=EUR,GBP"
with urllib.request.urlopen(url, timeout=10) as response:
data = json.load(response, parse_float=Decimal)
print(data["rates"]["EUR"])
print(data["sources"]["EUR"], data["effective_at"]["EUR"])
print(data["market_session"])python · requestscopy
# Install first: python -m pip install requests
import os
from decimal import Decimal
import requests
response = requests.get(
"https://api.exchangerate.dev/v1/latest/USD",
headers={"Authorization": f"Bearer {os.environ['EXCHANGERATE_API_KEY']}"},
timeout=10,
allow_redirects=False,
)
if response.status_code == 429:
raise RuntimeError(f"Rate limited; Retry-After: {response.headers.get('Retry-After')}")
if 300 <= response.status_code < 400:
raise RuntimeError("Unexpected redirect")
response.raise_for_status()
data = response.json(parse_float=Decimal)
print(data["rates"]["GBP"], data["effective_at"]["GBP"])python · convert 100 USD to EURcopy
import os
from decimal import Decimal
import requests
response = requests.get(
"https://api.exchangerate.dev/v1/convert/USD/EUR/100",
headers={"Authorization": f"Bearer {os.environ['EXCHANGERATE_API_KEY']}"},
timeout=10,
allow_redirects=False,
)
if not 200 <= response.status_code < 300:
raise RuntimeError(f"HTTP {response.status_code}; Retry-After: {response.headers.get('Retry-After')}")
data = response.json(parse_float=Decimal)
print(data["rate"], data["converted"])python · rate on a past datecopy
import os
from decimal import Decimal
import requests
response = requests.get(
"https://api.exchangerate.dev/v1/2026-03-14/USD?symbols=JPY",
headers={"Authorization": f"Bearer {os.environ['EXCHANGERATE_API_KEY']}"},
timeout=10,
allow_redirects=False,
)
if not 200 <= response.status_code < 300:
raise RuntimeError(f"HTTP {response.status_code}; Retry-After: {response.headers.get('Retry-After')}")
data = response.json(parse_float=Decimal)
print(data["rates"]["JPY"], data["is_forward_filled"])