کار با Fast Api ساده و سریع فریمورک فست ای پی آی
03 Khordad 1402
0 نظر
26 : 10
کار با Fast Api ساده و سریع

FastApi یک فریمورک مدرن، سریع (پرفرمنس بالا 1) برای ساخت وب سرویس با ورژن پایتون بالا تر از 3.6 و بر اساس ماژل  type 2 در پایتون.

FastAip on Git

 

عملکرد سریع : عملکرد بسیار بالا، همتراز با NodeJS و Go به لطف ( Starlette و Pydantic) ،یکی از سریع ترین چارچوب های پایتون موجود است.

کدنویسی سریع : سرعت توسعه را حدود 200% تا 300% افزایش دهید. *

اشکالات کمتر : حدود 40 درصد از خطاهای انسانی (توسعه دهنده) را کاهش می دهد. *

شهودی : پشتیبانی عالی از ویرایشگر (auto-complete, autocompletion, IntelliSense) و زمان کمتری برای رفع اشکال

آسان : برای استفاده و یادگیری آسان طراحی شده است. زمان کمتری برای خواندن اسناد کوتاه: تکرار کد را به حداقل برسانید. ویژگی های متعدد از هر اعلان پارامتردر نتیجه باگ کمتر.

قدرتمند: کد آماده دیپلوی را دریافت کنید به همراه مستند سازی خودکار.

مبتنی بر استانداردها: کاملاً سازگار و بنا شده بر اساس استانداردهای  OpenAPI و JSON Schema.

 

دستورالعمل:

1-با دستور زیر FastApi رو نصب کنید.

pip install fastapi

فکر نکنم لازم باشه بگم که با نصب FastApi سایر لایبراری هایی هم که نیاز داره رو نصب میکنه و مارو از نصب چندین پکیج دیگه خلاص میکنه.

2-با دستور زیر هم uvicorn رو نصب کنید

uvicorn برای اجرای یک سرور مبتنی بر ASGI3 است(اگه یادتون باشه تو مقاله چنلز هم سرور مبتنی بر ASGI نیاز داشتیم).

البته بجا Uvicorn میتونید از Hypercorn استفاده کنید (انتخابی)

pip install uvicorn

خب تا اینجا دیگه به نصب چیز دیگه ای نیاز نداریم و بریم که چند تا Route بنویسیم.

 

 

برای این کار طبق کد زیر در فایلی به نام main.py عمل کنید

 

1-from typing import Union

2-from fastapi import FastAPI

 

3-app = FastAPI()

4-@app.get("/")

5-def read_root():

6-    return {"Hello": "World"}

 

7-@app.get("/items/{item_id}")

8-def read_item(item_id: int):

9-    return {"item_id": item_id}

 

1-ایمپورت کردن Union که برای مبحث typing که در پانوشت توضیح دادم استفاده میشه (البته تو کد بالا من ازش استفاده نکردم.

2-ایمپورت کردن FastAPI 

3-برای شروع کار کافیه از FastAPI نمونه سازی کنیم که در اینجا نمونه رو با نام app ایجاد کردیم

4-حالا میتونیم از نمونه خودمون با نام app و بصورت decorator4 استفاد کنیم و با دستور get میگیم که این روت چه نوع در خاصتی رو میتونه قبول کنهو خود مسیر هم که تو پرانتز مینویسیم("/") این اسلش یا همون Forward Slash به روت اصلی پروژه یا همون صفحه خانه اشاره داره.

5-فانکشن اجرایی مون (اینجا چون کار با IO نداریم و فقط یک رشته رو برمیگردونیم دیگه متد رو از نوع async تعریف نکردم ولی چون سرور از نوع 

ASGI3 اجرا میشه هر موقع که با IO کار داشته باشیم میتونیم متد رو با async await بنویسیم ، تو مقاله های بعدی این کار رو انجام میدم)

6-بصورت کلید مقدار خروجی رو برمیگردونیم

7-اینجا هم مثل شماره 4 میمونه ولی مسیرمون متفاوته و میگیم تو مسیر items بیا و بهمون یک item_id بده 

توجه کنید که چون این ورودی ( {item_id} ) در براکت ذکر شده دیگه حالت انتخابی نداره و حتما باید ارسال بشه. 

ورودی هایی که حالت انتخابی دارن تو سه مورد تفاوت دارن با غیر انتخابی ها که اونم تو مقاله بعدی میگم.

8-این هم مثل مورد 5 هست با این تفاوت که این متد یک ورودی میگیره که با از مفهوم annotations پایتون بهره میبره و با پکیج pydantic دیگه اعتبار سنجی هم میشه ، یعنی اگه بجای اعداد مثلا (  12354 )اگر یک رشته مثلا ( hi ) ارسال بشه به شما خطا میده.

 

برای اجرای کد های بالا در حالت تولید (که در فایل main.py نوشتیم )uvicorn توضیه کرده که از دستور زیر استفاده کنیم.

uvicorn main:app --reload

 

 

با اجرای این دستور دیگه لازم نیست بعد از هر تغیر اپ رو راهاندازی مجدد کنیم و با زدن Ctr+S اپ خودکار ریلود میشه (این دستور مثل عملکرد پکیج nodemon در NodeJs هست)

مستند سازی خودکار:

برای مستند سازی خودکار FastApi از دو روش بهره میبره 

1-اسناد API تعاملی خودکار (ارائه شده توسط Swagger UI) را خواهید دید:

با قرار داد docs در مسیر پروژه http://127.0.0.1:8000/docs

2-اسناد API تعاملی خودکار (ارائه شده توسط ReDoc) را خواهید دید:

با قرار داد redoc در مسیر پروژه http://127.0.0.1:8000/redoc

 

اعتبار سنجی:

در FastApi روش های متفاوتی برای اعتبار سنجی اطلاعات وجود داره که یه چند مورد ازش میپردازیم

 

1-استفاده از Query در کوئری پارامتر های یک روت

این کلاس Query برای اعتبار سنجی کوئری های روت هست منظور مواردی در روت که بعد از علامت (؟) قرار میگیرند و برای اعتبار سنجی مواردی که بعنوان path در روت ارسال میشومند از کلاس Path استفاده میکنیم.

تفاوت Path و Query تفاوتشون در استفاده از علامت ؟ و / است.

ادرس زیر شامل کوئری است

webplant.ir?name=hossein

ادرس زیر شامل یک path است

webplant.ir/name=hossein

1-from fastapi import FastApi, Query, Path

2-app= FastApi()

3-app.get("/")

4-def create_user( name: str = Query(None, max_length=10, min_length=2):

    pass

1-خب بغیر از FastApi میایم و Query که برای اعتبار سنجی پارامتر ها در روت هست هم ایمپورت میکنیم.

مراحل 2 و 3 رو که قبلا گفتم

4-تو این مرحله با Query اعتبار سنجی های مورد نظر روی name رو انجام میدیم

4-1-همیشه Query بعنوان اولین پارامتر مقدار اولیه میگیره(یعنی اگر برای name مقداری نیومد میخوای جاش چی بزارم ولی یه مشکل که ایجاد میکنه اینکه دیگه name از حالت اجباری خارج میشه و انتخابی میشه، که جلوتر میگم برای حل این مسئله Query چه راهی برامون میزاره که این روش یکی از مواردیه که بنظرم FastApi رو فریمورک نتوینی میکنه) بجای اینکه سر راست بنویسید None میتونید اینجوری بنویسید Query(default=None)

4-2-در ادامه میتونید بقیه موارد اعتبار سنجی را اعمال کنید من max_length و min_length رو اعمال کردم. لیست این موارد اینجاست

4-3-خب گفتم که اولین پارامتری که Query میگیره مقدار پیش فرض هست که نمیشه خالیش گذاشت و وقتی با None مقدار دهیش میکنیم باعث میشه که کاربر بتونه انتخابی عمل کنه و اگه نخواست واسه name مقداری نفرسته. خب برای حل مشکل میتونیم از ویژگی ellipsis پایتون استفاده کنیم (این یکی از مواردیه که این فریمورک رو نویسن میکنه) و برای انجام دادنش کافیه بجای None بیایم و (...) سه نقطه بزاریم (بله دقیقا سه تا نقطه) دقیقا مثل روش زیر.

4-def create_user( name: str = Query(..., max_length=10, min_length=2):

    pass

2-برای کلاس Path هم دقیقا مثل روش بالا میتونید عمل کنید فقط بجای Query از کلاس Path استفاده کنید مثل کد زیر

4-def create_user( name: str = Path (..., max_length=10, min_length=2):

    pass

3-اعتبار سنجی در Model با کلاس Field از پکیجpydantic

1-from pydantic import BaseModel, Field

2-class Model(BaseModel):

3-    name: str = Field(..., max_length=10)

 4-   n: int

1-کلاس Field رو از پکیج pydantic ایمپورت می کنیم

2-کلاسمون رو ایجاد میکنیم و از کلاس BaseModel ارث بری میکنیم.

3-با کلاس تعین میکنیم که max_length در این name چقدر باید باشد

نکته در کلاس Field مانند کلاس Query و Path  اولین پارامتر مقدار پیش فرض خواهد بود که اگر نخواهیم به آن مقدار دهی اولیه کنیم با ellipsis پایتون و به شکل سه نقطه از مقدار دهی اولیه صرف نظر می کنیم.

 

 

 

1-کارایی بالا

2-type ماژولی در پایتون است که برای annotations (راهنما)  برای سایر برنامه نویسان محصوب می شود.

دقت داشته باشید که annotations در فریمورک جنگو نیز وجود دارد و این annotations جنگو هیچ ارتباطی با annotations در پایتون و ماژول type ندارد. ماژل type در پاتون برای تعین نوع که در زمان کامپایل نادیده گرفته میشود و صرفا جهت راهنمایی سایر توسعه دهنده ها طراحی شده و برای اجباری کردن آن میتوانید از pyline یا mypy استفاده کنید(البته داستان ماژل type در FastApi متفاوت بوده و با پکیج هایی مثل pydantic این تایپ ها اعتبار سنجی میشن و اگر نوع روردی متفاوت از نوع دریفاتی باشه با ارور مواجه خواهید شد.

 

3-Asynchronous Server Gateway Interface یا به اختصار ASGI یک رابط درگاه سرور بصورت ناهمزمان هست که و بدلیل استفاده از async await |(افزایش کارایی ، سرعت ، کم کردن حجم استفاده از منابع سرور و غیره) در  FastApi لازمه که سرور از ASGI بهره ببره.

4-خلاصه بگم که شما با مفهومی با عنوان decorator میتونید یک متد رو اجرا کنید(تو مقاله دیگه ای مسئله رو بازش میکنم فعلا فقط بنویسیدش بره)

چند قدم در چند راه

ابتدا وارد شوید یا ثبت نام کنید!

برای ثبت نظر، نقد ابتدا باید وارد شوید یا ثبت نام کنید.
سبد خرید