ویرگول
ورودثبت نام
ابوالفضل وکیلی
ابوالفضل وکیلیinstagram : @a_vakily7
ابوالفضل وکیلی
ابوالفضل وکیلی
خواندن ۴ دقیقه·۶ سال پیش

چجوری یک api ساده و سریع با پایتون بنویسیم؟


امروزه تو دنیای اپلیکشن ها مثل موبایل اپلیکیشن ها یا وب اپلیکیشن ها، api ها فوق العاده جایگاه ویژه ای به خودشون اختصاص دادن.

امروز می خوایم با هم یک سناریو ساده رو بررسی کنیم.

تصور کنید یک وبلاگ شخصی دارید و می خواید همه ی پست هایی که داخل وبلاگتون هست، درون اپلیکیشن اندرویدتون به نمایش در بیارین.
سناریو ما خیلی ساده هست یعنی فقط نمایش پست ها تو اپ اندرویدمون هست. فعلا احراز هویت برامون مهم نیست!
همچنین دیتابیسی که پست ها توشه، postgresql هست.

من برای اینکار از فریم ورک django استفاده می کنم.
(من پیش فرض رو بر این اساس گذاشتم که شما نصب جنگو رو بلدید!)

خب گام اول اینکه دیتابیس postgresql ، به پروژه جنگو متصل بشه. پس به فایل settings.py می ریم و تنظیمات مربوط به database رو تغییر می دیم :

حالا باید یک اپلیکشن جنگویی بسازیم (من اسمش رو گذاشتم api) :

python manage.py startapp api

همچینین اسم اپمونو به آخر این لیست اضافه می کنیم :

حالا به سراغ فایل test.py درون دایرکتوری api می ریم و تست هامونو (خواسته هامون) توش می نویسیم :

این تست ها چی می گن؟!
این تست ها همین سناریومونه! یعنی اگه درخواست به سرور با متد get اومد، سرور باید کوئریش رو بزنه و کد 200 رو برگردونه. در غیر اینصورت، کد 405 برگشت می ده که به معنی اینکه متدی که فرستادین غیر از get بوده مثلا post بوده یا partial update بوده که توی سناریو ما نمی گنجه!!!

اون multi_db هم برای اینکه می خوام علاوه بر اینکه دیتابیس پیش فرض sqlite هست، از دیتابیس postgresql هم استفاده کنم.

گام بعدی می ریم ویو هامونو می نویسیم :

چی کار کردم ؟
اول باید بگم که من ویومو بر اساس منطق cbv نوشتم.
متد ها رو با استفاده از تابع dispatch کنترل کردم و گفتم که اگه با GET درخواست شده بود، کار کن. در غیر اینصورت یعنی با هر متد دیگه ای که فرستاده شد، بگو متد اشتباه هست.
داخل تابع لیست ویو یک try catch نوشتم (دلیلش رو در ادامه می گم!)
داخل try گفتم که به اون دیتابیس postgres یک کانکشن باز کن و بعد بیا یک کوئری بزن و بعدش با استفاده از تابع dictfetchall جوابش رو به صورت json درست کن و بلافاصله کانکشنو ببند و در اخر هم جواب رو به صورت json برگردون.

راستی دلیل اون try catch چی بودش؟!
ببینید یکی از مهارت های مهمی که یک برنامه نویس باید داشته باشه مدیریت خطا هاست.
مدیریت خطا ها کمک شایانی می کنه به نگهداری کدتون.
فرض کنید موقع باز شدن کانکشن، مشکلی تو شبکه پیش بیاد، پس کل عملیات به اصطلاح fail میشه
توی کد هم گفتم اگه این اتفاق بیوفته، بیا یک اکسپشن کلی raise کن. حالا چرا کلی نوشتم ؟ چون این مدل اشکالات باید تست بشن و کد منو طولانی می کرد، پس گفتم یک اکسپشن کلی!

گام آخر اینکه مسیر ها رو تعریف می کنیم :

یک فایل urls.py داخل دایرکتوری اپمون می سازیم و مسیرش رو مشخص می کنیم :

خب این مسیره کار نمی کنه مگر اینکه توسط اپ اصلی جنگو (همونی که اسمش با پروژه یکی هست) تعریف بشه پس :

حالا اگه برگردیم و تست هامونو اجرا کنیم، می بینیم که همه تست ها پاس شده اند :

الان api ما حاضر شد بیاید با postman بهتون نشون بدم (فقط حواستون باشه سرورتون بالا باشه) :

خب به پایان این نوشته رسیدیم. امیدوارم براتون مفید بوده باشه. بازم می گم هدف من در اینجا نوشتن یک api بود که سه تا ویژگی داشته باشه : ساده - سریع - پایتون ---> یعنی یه چیزی باشه که کارتونو سریع راه بندازه!
این api یی که با هم نوشتیم خوبه اما اگه بخواین api درست و درمون تر بنویسین اونم با فریم ورک جنگو، پیشنهاد می کنم از django restframework استفاده کنید.

از همراهیتون صمیمانه سپاسگزارم

apiپایتون
۱۳
۱
ابوالفضل وکیلی
ابوالفضل وکیلی
instagram : @a_vakily7
شاید از این پست‌ها خوشتان بیاید