← सभी गाइड

करियर आँकड़ों के साथ राइडर प्रोफ़ाइल पेज

रेस नंबर के आधार पर राइडर की प्रोफ़ाइल और करियर टोटल को एक प्रोफ़ाइल कार्ड में जोड़ें।

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_url null हो सकता है। टूटी इमेज की जगह रेस नंबर को रंगीन बैज में दिखाएँ।
  • जो नंबर इस्तेमाल में नहीं है, उस पर 404 मिलता है; त्रुटि की जगह “राइडर नहीं मिला” पेज रेंडर करें।
  • राइडर कभी-कभी सीज़न के बीच नंबर बदल लेते हैं। अगर आप पसंदीदा सहेजते हैं, तो नंबर के साथ वह सीज़न भी सहेजें जिससे वह लिया गया था।
अगला गाइड → सीज़न कैलेंडर, अगली रेस और नतीजे