فصل ۱۷ — مصرف APIها در Django

۱. مقدمه — API چیست و چرا استفاده میکنیم؟
API (Application Programming Interface) یعنی واسطی که برنامهها بتونن با هم ارتباط بگیرن.
APIها دادهها رو معمولاً در قالب JSON یا XML برمیگردونن.
مثالهای کاربردی در فروشگاه آنلاین:
- دریافت نرخ ارز از یک سرویس بانکی
- چک کردن وضعیت پرداخت از درگاه بانکی
- گرفتن اطلاعات محصول از یک سرویس خارجی (مثلاً بازارچه آنلاین)
- گرفتن اطلاعات حمل و نقل از سرویس پست
۲. ابزارهای مصرف API در Django
در پایتون برای کار با API معمولاً از کتابخونهها استفاده میکنیم:
requests→ ساده، معروف و پرکاربردurllib→ کتابخانه پیشفرض پایتون (کمتر استفاده میشه چون پیچیدهتره)- کتابخانههای اختصاصی هر API (مثل SDK برای Stripe یا Google)
📌 برای نصب requests:
pip install requests
۳. اولین درخواست API با requests
import requests
response = requests.get("https://api.exchangerate-api.com/v4/latest/USD")
data = response.json() # تبدیل JSON به دیکشنری پایتون
print(data["rates"]["EUR"])
📌 نکته:
.get()برای گرفتن داده.post()برای ارسال داده.json()برای دیکد کردن JSON
۴. مصرف API در Django (مثال نرخ ارز)
فرض کنیم فروشگاه ما محصولات رو به دلار قیمتگذاری کرده ولی میخوایم به کاربر ایرانی به تومان نشون بدیم.
views.py
import requests
from django.shortcuts import render
from django.conf import settings
def product_list(request):
products = [
{"name": "کفش ورزشی", "price_usd": 50},
{"name": "ساعت کلاسیک", "price_usd": 120}
]
# گرفتن نرخ ارز از API
try:
res = requests.get("https://api.exchangerate-api.com/v4/latest/USD", timeout=5)
data = res.json()
usd_to_irr = data["rates"]["IRR"] # فرضی: API نرخ ریال رو برمیگردونه
except Exception as e:
usd_to_irr = 50000 # نرخ پیشفرض در صورت خطا
for p in products:
p["price_irr"] = p["price_usd"] * usd_to_irr
return render(request, "products.html", {"products": products})
📌 اینجا ما:
- API رو مصرف کردیم
- Timeout گذاشتیم برای جلوگیری از هنگ کردن
- نرخ پیشفرض گذاشتیم اگر API در دسترس نبود
۵. ارسال داده به API (POST Request)
مثلاً پرداخت به درگاه بانکی:
payload = {
"amount": 100000,
"callback_url": "https://yourstore.com/payment/verify",
"order_id": 123
}
res = requests.post("https://api.zarinpal.com/payment/request", json=payload)
result = res.json()
print(result)
📌 json=payload → داده به صورت JSON ارسال میشه
📌 بعضی APIها data=payload رو میخوان که فرمدیتا ارسال بشه
۶. استفاده از Header و Token
بسیاری از APIها نیازمند Authentication Token هستند.
headers = {
"Authorization": f"Bearer {settings.API_TOKEN}",
"Accept": "application/json"
}
res = requests.get("https://api.example.com/user/orders", headers=headers)
📌 توصیه امنیتی: Token ها رو در .env ذخیره کن.
۷. هندل کردن خطاهای API
بهتره همیشه پاسخ رو چک کنیم:
if res.status_code == 200:
data = res.json()
else:
print("خطا در دریافت داده:", res.status_code)
۸. کش کردن پاسخ API (Cache)
برای جلوگیری از فراخوانی زیاد API (که ممکنه هزینه داشته باشه یا کند باشه):
from django.core.cache import cache
def get_currency_rate():
rate = cache.get("usd_to_irr")
if not rate:
res = requests.get("https://api.exchangerate-api.com/v4/latest/USD")
data = res.json()
rate = data["rates"]["IRR"]
cache.set("usd_to_irr", rate, 3600) # یک ساعت کش
return rate
۹. مصرف API در پسزمینه (Async – Celery)
برای کارهایی که نیاز به زمان دارند مثل جمعآوری داده:
# tasks.py
from celery import shared_task
import requests
@shared_task
def fetch_currency_to_db():
res = requests.get("https://api.exchangerate-api.com/v4/latest/USD")
data = res.json()
# ذخیره در DB
۱۰. سناریوی عملی — رهگیری بسته پستی
فرض کنیم کاربر محصول رو خریده و ما شماره رهگیری پست رو داریم. حالا با API پست، وضعیت رو میگیریم.
def track_package(tracking_code):
res = requests.get(f"https://api.post.ir/track?code={tracking_code}")
if res.status_code == 200:
return res.json()
return {"status": "نامشخص"}
۱۱. بهترین روشها در مصرف API
- همیشه Timeout بگذار
- Cache کن اگه دادهها ثابت یا کم تغییر میکنن
- خطاها رو لاگ کن
- API Key و Token رو در
.envنگه دار - برای دادههای حساس از HTTPS استفاده کن
۱۲. جمعبندی فصل ۱۷
توی این فصل یاد گرفتیم:
- API چیه و چرا استفاده میکنیم
- با requests داده بگیریم و بفرستیم
- احراز هویت با Header
- مدیریت خطا و کش کردن پاسخ
- سناریوی واقعی نرخ ارز و رهگیری پست