Sensei: ساده سازی API Client Generation

Summarize this content to 400 words in Persian Lang
سنسی فرآیند ایجاد API Clients را با مدیریت مسیریابی، اعتبارسنجی داده ها و نگاشت پاسخ به طور خودکار ساده می کند. این امر پیچیدگی درخواستهای HTTP را کاهش میدهد و ادغام APIها را در پروژههای شما بدون نوشتن کد دیگ بخار آسانتر میکند.
Sensei از راهنماییهای نوع برای تولید کلاینتهای API، ارائه رابطهای واضح و اعتبارسنجی قوی برای تعامل با APIها استفاده میکند. سینتکس آن بسیار شبیه به فریمورک است FastAPI
مثال کد
from typing import Annotated
from sensei import Router, Path, APIModel
router = Router(‘https://pokeapi.co/api/v2/’)
class Pokemon(APIModel):
name: str
id: int
height: int
weight: int
@router.get(‘/pokemon/{name}’)
def get_pokemon(name: Annotated[str, Path(max_length=300)]) -> Pokemon:
pass
pokemon = get_pokemon(name=”pikachu”)
print(pokemon) # Pokemon(name=”pikachu” id=25 height=4 weight=60)
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
آیا به نظر شما نمی رسد که تابع حاوی کد نیست؟ سنسی به جای تو می نویسد! نتیجه تماس get_pokemon(name=”pikachu”) شی است Pokemon(name=”pikachu” id=25 height=4 weight=60) حاوی داده های پوکمون
یک رویکرد OOP فوق العاده وجود دارد که توسط Sensei پیشنهاد شده است:
class User(APIModel):
email: EmailStr
id: PositiveInt
first_name: str
last_name: str
avatar: AnyHttpUrl
@classmethod
@router.get(‘/users’)
def query(
cls,
page: Annotated[int, Query()] = 1,
per_page: Annotated[int, Query(le=7)] = 3
) -> list[Self]:
pass
@classmethod
@router.get(‘/users/{id_}’)
def get(cls, id_: Annotated[int, Path(alias=’id’)]) -> Self:
pass
@router.post(‘/token’)
def login(self) -> str:
pass
@login.prepare
def _login_in(self, args: Args) -> Args:
args.json_[’email’] = self.email
return args
@login.finalize
def _login_out(self, response: Response) -> str:
return response.json()[‘token’]
user = User.get(1)
user.login() # User(id=1, email=”john@example.com”, first_name=”John”, …)
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
هنگامی که Sensei نمی داند چگونه یک درخواست را مدیریت کند، می توانید آن را خودتان با استفاده از پیش پردازش به عنوان انجام دهید prepare و پس پردازش به عنوان finalize
مقایسه
سنسی: سطح بالایی از انتزاع را ارائه می دهد. Sensei ایجاد بستههای API را ساده میکند، دکوراتورهایی را برای مسیریابی آسان، اعتبارسنجی دادهها و نقشهبرداری خودکار پاسخهای API به مدلها ارائه میدهد. این کار دیگ بخار را کاهش می دهد و خوانایی کد و قابلیت نگهداری را بهبود می بخشد.
کلاینت برهنه HTTP: یک سرویس گیرنده HTTP خالی مانند requests یا httpx نیاز به مدیریت دستی درخواستها، مدیریت تجزیه پاسخ، اعتبارسنجی دادهها و مدیریت خطا دارد. برای هر نقطه پایانی باید کدهای تکراری بنویسید.
ویژگی ها
Sensei ویژگی هایی را ارائه می دهد که برای API های استاندارد و آشفته مفید هستند:
اعتبار سنجی 🛡️
مدیریت محدود کننده نرخ ⏳
جابجایی اتوماتیک انواع مرجوعی 🔄
معماری DRY بدون تکرار 🧹
پشتیبانی Async ⚡
تبدیل کیس و نام مستعار 🔠
مشتری خود برای درخواست های سریع 🚀
مخاطب هدف
توسعه دهندگانی که با API ها کار می کنند، دانشمندان و تحلیلگران داده و غیره.
سنسی فرآیند ایجاد API Clients را با مدیریت مسیریابی، اعتبارسنجی داده ها و نگاشت پاسخ به طور خودکار ساده می کند. این امر پیچیدگی درخواستهای HTTP را کاهش میدهد و ادغام APIها را در پروژههای شما بدون نوشتن کد دیگ بخار آسانتر میکند.
Sensei از راهنماییهای نوع برای تولید کلاینتهای API، ارائه رابطهای واضح و اعتبارسنجی قوی برای تعامل با APIها استفاده میکند. سینتکس آن بسیار شبیه به فریمورک است FastAPI
مثال کد
from typing import Annotated
from sensei import Router, Path, APIModel
router = Router('https://pokeapi.co/api/v2/')
class Pokemon(APIModel):
name: str
id: int
height: int
weight: int
@router.get('/pokemon/{name}')
def get_pokemon(name: Annotated[str, Path(max_length=300)]) -> Pokemon:
pass
pokemon = get_pokemon(name="pikachu")
print(pokemon) # Pokemon(name="pikachu" id=25 height=4 weight=60)
آیا به نظر شما نمی رسد که تابع حاوی کد نیست؟ سنسی به جای تو می نویسد! نتیجه تماس get_pokemon(name="pikachu")
شی است Pokemon(name="pikachu" id=25 height=4 weight=60)
حاوی داده های پوکمون
یک رویکرد OOP فوق العاده وجود دارد که توسط Sensei پیشنهاد شده است:
class User(APIModel):
email: EmailStr
id: PositiveInt
first_name: str
last_name: str
avatar: AnyHttpUrl
@classmethod
@router.get('/users')
def query(
cls,
page: Annotated[int, Query()] = 1,
per_page: Annotated[int, Query(le=7)] = 3
) -> list[Self]:
pass
@classmethod
@router.get('/users/{id_}')
def get(cls, id_: Annotated[int, Path(alias='id')]) -> Self:
pass
@router.post('/token')
def login(self) -> str:
pass
@login.prepare
def _login_in(self, args: Args) -> Args:
args.json_['email'] = self.email
return args
@login.finalize
def _login_out(self, response: Response) -> str:
return response.json()['token']
user = User.get(1)
user.login() # User(id=1, email="john@example.com", first_name="John", ...)
هنگامی که Sensei نمی داند چگونه یک درخواست را مدیریت کند، می توانید آن را خودتان با استفاده از پیش پردازش به عنوان انجام دهید prepare
و پس پردازش به عنوان finalize
مقایسه
سنسی: سطح بالایی از انتزاع را ارائه می دهد. Sensei ایجاد بستههای API را ساده میکند، دکوراتورهایی را برای مسیریابی آسان، اعتبارسنجی دادهها و نقشهبرداری خودکار پاسخهای API به مدلها ارائه میدهد. این کار دیگ بخار را کاهش می دهد و خوانایی کد و قابلیت نگهداری را بهبود می بخشد.
کلاینت برهنه HTTP: یک سرویس گیرنده HTTP خالی مانند requests
یا httpx
نیاز به مدیریت دستی درخواستها، مدیریت تجزیه پاسخ، اعتبارسنجی دادهها و مدیریت خطا دارد. برای هر نقطه پایانی باید کدهای تکراری بنویسید.
ویژگی ها
Sensei ویژگی هایی را ارائه می دهد که برای API های استاندارد و آشفته مفید هستند:
- اعتبار سنجی 🛡️
- مدیریت محدود کننده نرخ ⏳
- جابجایی اتوماتیک انواع مرجوعی 🔄
- معماری DRY بدون تکرار 🧹
- پشتیبانی Async ⚡
- تبدیل کیس و نام مستعار 🔠
- مشتری خود برای درخواست های سریع 🚀
مخاطب هدف
توسعه دهندگانی که با API ها کار می کنند، دانشمندان و تحلیلگران داده و غیره.