करियर आँकड़ों के साथ राइडर प्रोफ़ाइल पेज
रेस नंबर के आधार पर राइडर की प्रोफ़ाइल और करियर टोटल को एक प्रोफ़ाइल कार्ड में जोड़ें।
8 मिनट में पढ़ें
फ़ैन ऐप, फ़ैंटेसी गेम और न्यूज़ साइट, सभी को हर राइडर के लिए एक पेज चाहिए। प्रोफ़ाइल कार्ड के लिए दो कॉल सब कुछ दे देती हैं: राइडर और उनके करियर टोटल।
दो कॉल
GET /riders/93
GET /riders/93/career-stats
/riders/{rider_number} प्रोफ़ाइल लौटाता है:
{
"rider_number": 93,
"full_name": "Marc Márquez",
"nationality": "Spain",
"flag": "🇪🇸",
"birth_date": "1993-02-17",
"height_cm": 168,
"weight_kg": 59,
"team_name": "Gresini Racing MotoGP",
"image_url": null
}
/riders/{rider_number}/career-stats टोटल लौटाता है:
{
"rider_number": 93,
"rider_name": "Marc Márquez",
"total_wins": 44,
"total_podiums": 66,
"total_points": 1302,
"world_titles": 2,
"total_races": 118
}
करियर टोटल API में उपलब्ध सीज़न से निकाले जाते हैं, राइडर के पूरे करियर से नहीं। उन्हें उसी हिसाब से लेबल करें, जैसे “2024 से”।
दोनों को समानांतर में लाएँ
import os
from concurrent.futures import ThreadPoolExecutor
from dataclasses import dataclass
from datetime import date
import requests
HOST = "motogp-api-championship-data-statistics.p.rapidapi.com"
HEADERS = {"X-RapidAPI-Key": os.environ["RAPIDAPI_KEY"], "X-RapidAPI-Host": HOST}
def get(path: str) -> dict:
res = requests.get(f"https://{HOST}{path}", headers=HEADERS, timeout=10)
res.raise_for_status()
return res.json()["data"]
@dataclass(frozen=True)
class RiderCard:
number: int
name: str
flag: str
team: str
age: int
wins: int
podiums: int
titles: int
races: int
@property
def podium_rate(self) -> float:
return self.podiums / self.races if self.races else 0.0
def age_on(birth: str, today: date) -> int:
born = date.fromisoformat(birth)
return today.year - born.year - ((today.month, today.day) < (born.month, born.day))
def rider_card(number: int) -> RiderCard:
with ThreadPoolExecutor(max_workers=2) as pool:
profile_f = pool.submit(get, f"/riders/{number}")
stats_f = pool.submit(get, f"/riders/{number}/career-stats")
profile, stats = profile_f.result(), stats_f.result()
return RiderCard(
number=profile["rider_number"],
name=profile["full_name"],
flag=profile["flag"],
team=profile["team_name"],
age=age_on(profile["birth_date"], date.today()),
wins=stats["total_wins"],
podiums=stats["total_podiums"],
titles=stats["world_titles"],
races=stats["total_races"],
)
card = rider_card(93)
print(f"{card.flag} #{card.number} {card.name} — {card.team}, {card.age}")
print(f"{card.wins} wins, {card.podiums} podiums in {card.races} races ({card.podium_rate:.0%})")
इंडेक्स पेज बनाएँ
प्रोफ़ाइल पेजों को लिंक करने के लिए एक सूची चाहिए:
| पेज | Endpoint |
|---|---|
| इस सीज़न की ग्रिड | GET /riders/seasons/{year}?category=MOTOGP |
| देश के अनुसार राइडर | GET /riders/nationality/{nationality} (जैसे Italy) |
| डेटाबेस के सभी राइडर | GET /riders?page=1&size=200 |
URL स्लग के रूप में rider_number इस्तेमाल करें (/riders/93/); फ़ैन्स यही खोजते हैं।
ग़ायब डेटा संभालें
image_urlnullहो सकता है। टूटी इमेज की जगह रेस नंबर को रंगीन बैज में दिखाएँ।- जो नंबर इस्तेमाल में नहीं है, उस पर
404मिलता है; त्रुटि की जगह “राइडर नहीं मिला” पेज रेंडर करें। - राइडर कभी-कभी सीज़न के बीच नंबर बदल लेते हैं। अगर आप पसंदीदा सहेजते हैं, तो नंबर के साथ वह सीज़न भी सहेजें जिससे वह लिया गया था।