۳۰ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

با FastAPI شروع کنید

از چارچوب وب FastAPI و Python برای ایجاد سریع APIهای وب سازگار با OpenAPI و همچنین وب سایت های کامل استفاده کنید.

از چارچوب وب FastAPI و Python برای ایجاد سریع APIهای وب سازگار با OpenAPI و همچنین وب سایت های کامل استفاده کنید.

زمانی که چارچوب‌های وب پایتون مانند Flask و Django برای اولین بار به شهرت رسیدند، Python زبانی متفاوت از امروز بود. بسیاری از عناصر پایتون مدرن، مانند اجرای ناهمزمان و استاندارد ASGI (واسط دروازه سرور ناهمزمان)، یا در مراحل اولیه خود بودند یا هنوز وجود نداشتند.

FastAPI یک چارچوب وب پایتون است که از ابتدا برای ادغام ویژگی های مدرن پایتون ساخته شده است. از استاندارد ASGI برای اتصال ناهمزمان و همزمان با مشتریان استفاده می کند و در صورت نیاز می تواند با WSGI کار کند. توابع ناهمزمان برای مسیرها و نقاط پایانی تعبیه شده اند. و FastAPI به شما اجازه می دهد تا برنامه های کاربردی وب را با کدهای تمیز و مدرن پایتون با نکات نوع به طور کارآمد توسعه دهید.

همانطور که از نام آن پیداست، یک مورد استفاده اولیه از FastAPI ساخت سریع نقاط پایانی API است. این کار را می‌توانید به راحتی بازگرداندن داده‌های فرهنگ لغت پایتون به‌عنوان JSON یا با استفاده از استاندارد OpenAPI از جمله یک رابط کاربری Swagger تعاملی انجام دهید. اما FastAPI به هیچ وجه محدود به API ها نیست. می‌توانید تقریباً برای هر کاری که یک چارچوب وب انجام می‌دهد از آن استفاده کنید، از ارائه صفحات وب ساده قدیمی با استفاده از موتور قالب Jinja2 تا ارائه برنامه‌های کاربردی با پشتیبانی WebSockets.

نصب FastAPI

FastAPI می‌تواند چندین مؤلفه را به تنهایی نصب کند، بنابراین بهتر است هر پروژه FastAPI را در یک محیط مجازی جدید و تمیز شروع کنید. اجزای اصلی FastAPI را می توان با pip install fastapi نصب کرد.

شما همچنین باید یک سرور ASGI را برای آزمایش محلی نصب کنید. FastAPI به خوبی با Uvicorn کار می کند، بنابراین ما از آن در مثال های خود در اینجا استفاده خواهیم کرد. می‌توانید از pip install uvicorn[استاندارد] برای نصب Uvicorn با مجموعه مؤلفه‌های بهینه با کتابخانه‌های C استفاده کنید، یا از pip install uvicorn برای نصب یک نسخه حداقلی و خالص پایتون استفاده کنید.

مثال ساده FastAPI

یک برنامه ساده FastAPI در اینجا آمده است:


from fastapi import FastAPI
app = FastAPI()

@app.get("/")
async def root():
    return {"greeting":"Hello world"}

این را به عنوان main.py ذخیره کنید، سپس آن را از داخل “venv” خود با دستور uvicorn main:app اجرا کنید. شیء app چیزی است که برای سرور ASGI خود استفاده می‌کنید. (توجه داشته باشید که می توانید از WSGI با آداپتور ASGI-to-WSGI نیز استفاده کنید، اما بهتر است از ASGI استفاده کنید.)

هنگامی که همه چیز در حال اجرا است، به localhost:8000 (پیش‌فرض برای یک سرور آزمایشی Uvicorn) بروید. {"greeting":"Hello world"} را در مرورگر خواهید دید—یک پاسخ JSON معتبر که از فرهنگ لغت ایجاد شده است.

نحوه استفاده از Google’s Palm 2 API با LangChain

این باید به شما ایده دهد که FastAPI چقدر راحت می‌تواند JSON را از نقطه پایانی تحویل دهد. تنها کاری که باید انجام دهید این است که یک مسیر ایجاد کنید و یک فرهنگ لغت پایتون را برگردانید که به طور خودکار به JSON سریال می شود. مراحلی وجود دارد که می‌توانید برای سریال‌سازی انواع داده‌های پیچیده انجام دهید که بعداً به آن‌ها خواهیم پرداخت.

طرح کلی یک برنامه کاربردی FastAPI باید برای هر کسی که با سیستم هایی مانند Flask کار کرده است آشنا باشد:

  • شئ app به سرور ASGI یا WSGI وارد می‌شود و برای اجرای برنامه استفاده می‌شود.
  • می توانید از دکوراتورها برای اضافه کردن مسیرها به برنامه استفاده کنید. برای مثال، @app.get("/") یک مسیر روش GET را در ریشه سایت ایجاد می کند که نتایج آن توسط تابع پیچیده شده برگردانده می شود.

با این حال، برخی از تفاوت‌ها باید از قبل برجسته شوند. به عنوان مثال، توابع مسیر شما می‌توانند ناهمزمان باشند، به طوری که هر مؤلفه ناهمگامی که مستقر می‌کنید – به عنوان مثال، اتصال میان‌افزار پایگاه داده ناهمزمان – می‌تواند در آن توابع نیز اجرا شود.

توجه داشته باشید که در صورت نیاز هیچ چیز مانع از استفاده شما از توابع همگام معمولی نمی شود. در واقع، اگر عملیاتی دارید که از نظر محاسباتی گران است، برخلاف عملیاتی که در I/O منتظر می ماند (همانطور که بهترین حالت استفاده برای async است)، بهتر است از یک تابع همگام سازی استفاده کنید و اجازه دهید FastAPI آن را مرتب کند. بقیه زمان‌ها، از async استفاده کنید.

انواع مسیر در FastAPI

دکوراتور @app به شما امکان می‌دهد روش را تنظیم کنید< /a> برای مسیر استفاده می شود، به عنوان مثال، @app.get یا @app.post. GET، POST، PUT، DELETE و OPTIONS کمتر استفاده شده، HEAD، PATCH، و TRACE همه از این طریق پشتیبانی می‌شوند.

همچنین می‌توانید چندین روش را در یک مسیر مشخص به سادگی با قرار دادن چندین تابع مسیر، به عنوان مثال، @app.get("/") در یک تابع و @app.post( "/") روی دیگری.

پارامترهای مسیر، پرس و جو و فرم در FastAPI

اگر می‌خواهید متغیرها را از مسیر مسیر استخراج کنید، می‌توانید این کار را با تعریف آنها در اعلان مسیر و سپس ارسال آنها به تابع مسیر انجام دهید.


@app.get("/users/{user_id}")
async def user(user_id: str):
    return {"user_id":user_id}

برای استخراج پارامترهای پرس و جو از URL، می توانید از اعلان های تایپ شده در تابع مسیر استفاده کنید، که FastAPI به طور خودکار آنها را شناسایی می کند:


userlist = ["Spike","Jet","Ed","Faye","Ein"]

@app.get("/userlist")
async def userlist_(start: int = 0, limit: int = 3):
    return userlist[start:start+limit]

به این ترتیب، پارامترهای جستجو start و limit به‌طور خودکار از URL استخراج می‌شوند و در آن متغیرهای نام‌گذاری شده ارسال می‌شوند. اگر آن پارامترها وجود نداشتند، مقادیر پیش‌فرض به آن‌ها اختصاص داده می‌شد.

پردازش داده های فرم کمی پیچیده تر است. ابتدا باید یک کتابخانه اضافی به نام python-multipart نصب کنید تا داده های فرم را تجزیه کنید (pip install python-multipart). سپس از نحوی مشابه نحو پارامتر query استفاده می‌کنید، اما با چند تغییر:


from fastapi import Form

@app.post("/lookup")
async def userlookup(username: str = Form(...), user_id: str = Form("")):
    return {"username": username, "user_id":user_id}

شئ Form پارامتر نامگذاری شده (username, user_id) را از فرم ارسال شده استخراج می کند و آن را به همراه ارسال می کند. توجه داشته باشید که اگر از Form(...) در اعلان استفاده می کنید، این نشان می دهد که پارامتر مورد نظر لازم است، مانند username اینجا. برای یک عنصر فرم اختیاری، مقدار پیش‌فرض آن عنصر را به Form منتقل کنید، مانند user_id در اینجا (Form("") ).

وظایف خود را با Microsoft To Do API مدیریت کنید

انواع پاسخ در FastAPI

نوع پاسخ پیش‌فرض برای FastAPI JSON است و تا کنون تمام نمونه‌ها داده‌هایی را که به‌طور خودکار به صورت سریالی JSON هستند، برمی‌گردانند. اما می‌توانید انواع دیگر پاسخ‌ها را نیز برگردانید. به عنوان مثال:


from fastapi.responses import HTMLResponse

@app.get("/")
def root():
    return HTMLResponse("<b>Hello world</b>")

ماژول fastapi.responses بسیاری از انواع پاسخ های رایج را پشتیبانی می کند:

  • HTMLResponse یا PlainTextResponse: متن را به صورت HTML یا متن ساده برمی‌گرداند.
  • RedirectResponse: به URL ارائه شده هدایت می شود.
  • FileResponse: فایلی را از یک مسیر ارائه شده، که به صورت ناهمزمان پخش شده است، برمی‌گرداند.
  • Sreaming Response: یک ژنراتور را دریافت می‌کند و نتایج را به مشتری ارسال می کند.

همچنین می‌توانید از یک پاسخ عمومی استفاده کنید > شی، و کد وضعیت، سرصفحه، محتوا و نوع رسانه سفارشی شده خود را ارائه دهید.

اگر می‌خواهید HTML را به صورت برنامه‌نویسی برای یک HTMLResponse تولید کنید، می‌توانید این کار را با Jinja2 یا موتور قالب دیگری که انتخاب می‌کنید انجام دهید.

شیء Response در FastAPI

توجه داشته باشید که وقتی می‌خواهید با یک پاسخ کار کنید، برای مثال با تنظیم کوکی‌ها یا تنظیم سرصفحه‌ها، می‌توانید این کار را با پذیرش یک شی Response به عنوان پارامتر در تابع مسیر خود انجام دهید:

>


from fastapi import Response

@app.get("/")
def modify_header(response:Response):
    response.headers["X-New-Header"] = "Hi, I'm a new header!"
    return {"msg":"Headers modified in response"}

کوکی‌ها در FastAPI

بازیابی کوکی‌ها از کلاینت مانند رسیدگی به پرس و جو یا پارامترهای فرم عمل می‌کند:


from fastapi import Cookie

@app.get("/")
async def main(user_nonce: Optional[str]=Cookie(none)):
    return {"user_nonce": user_nonce}

تنظیم کوکی‌ها با استفاده از روش .set_cookie() روی یک شی Response انجام می‌شود:


from fastapi import Response

@app.post("/")
async def main(response: Response):
    response.set_cookie(key="user_nonce", value="")
    return {"msg":"User nonce cookie cleared"}

استفاده از مدل‌های Pydantic با FastAPI

انواع در پایتون عموماً اختیاری هستند، اما FastAPI بیشتر از بسیاری دیگر از فریم‌ورک‌های پایتون در مورد استفاده از انواع استفاده می‌کند. FastAPI از کتابخانه Pydantic برای تأیید صحت داده‌های ارسالی استفاده می‌کند، بنابراین نیازی به نوشتن منطق برای انجام این کار ندارید. که خودتان.

در اینجا مثالی از نحوه استفاده از Pydantic برای اعتبارسنجی JSON ورودی آورده شده است:


from typing import List, Optional
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr

app = FastAPI()

class Movie(BaseModel):
    name: str
    year: int
    rating: Optional[int] = None
    tags: List[str] = []

@app.post("/movies/", response_model=Movie)
async def create_movie(movie: Movie):
    return movie

این قطعه داده‌های JSON را از طریق POST (نه فرم HTML!) با فیلدهای name، year، رتبه‌بندی می‌پذیرد. و برچسب ها. سپس انواع هر یک از این فیلدها تایید می شود. به عنوان مثال، داده های زیر معتبر هستند:


{
    "name":"Blade Runner 2049",
    "year": 2018,
    "rating": 5,
    "tags": ["science fiction","dystopia"]
}

اگر year رشته‌ای بود که می‌توانست به‌عنوان یک عدد صحیح تفسیر شود (مثلاً "۲۰۱۸") به‌طور خودکار به نوع داده مناسب تبدیل می‌شد. اما اگر مقدار year داشته باشیم که نمی‌توان آن را به عنوان یک عدد صحیح تفسیر کرد، رد می‌شود.

Go 1.20 پیش‌نمایش بهینه‌سازی هدایت‌شده پروفایل را نشان می‌دهد

استفاده از WebSockets در FastAPI

نقاط پایانی WebSocket در FastAPI نیز ساده هستند:


from fastapi import FastAPI, WebSocket

@app.websocket("/ws")
async def ws_connection(websocket: WebSocket):
    await websocket.accept()
    while True:
        data = await websocket.receive_text()
        await websocket.send_text(f"You said: {data}")

این مثال اتصالی را در نقطه پایانی /ws دریافت می‌کند، که معمولاً در جاوا اسکریپت با یک شی WebSocket ایجاد می‌شود، سپس منتظر ورودی می‌ماند و پاسخ را در یک حلقه بازتاب می‌دهد.

WebSockets، به عنوان یک قاعده، امنیت احراز هویت چندانی ندارند. یک روش معمول این است که یک اتصال WebSockets ایمن ایجاد کنید، سپس به عنوان اولین پیام نوعی توکن یا اعتباری را که کاربر را احراز هویت می کند به سوکت ارسال کنید. FastAPI مکانیسم‌های اضافی برای ایمن کردن اتصالات WebSocket ارائه نمی‌کند، بنابراین باید خودتان آن عملکرد را بسازید.

استفاده از Swagger/OpenAPI در FastAPI

OpenAPI که قبلاً با نام Swagger شناخته می شد، یک استاندارد با قالب JSON برای توصیف نقاط پایانی API است. یک سرویس گیرنده می تواند یک تعریف OpenAPI را برای یک نقطه پایانی بخواند و به طور خودکار طرحواره های داده های ارسال و دریافت شده توسط API های یک وب سایت را تعیین کند.

FastAPI به طور خودکار تعاریف OpenAPI را برای تمام نقاط پایانی یک وب سایت ایجاد می کند. اگر از /openapi.json در ریشه یک سایت FastAPI بازدید کنید، یک فایل JSON دریافت خواهید کرد که هر نقطه پایانی، داده‌هایی را که می‌تواند دریافت کند و داده‌هایی که برمی‌گرداند توضیح می‌دهد.

یکی دیگر از سهولت‌هایی که FastAPI فراهم می‌کند، رابط‌های مستندسازی خودکار برای APIهای شما است که می‌توانید از طریق یک رابط وب با آنها تعامل داشته باشید. اگر به /docs بروید، صفحه‌ای را برای APIهای خود می‌بینید که توسط ReDoc ایجاد شده است. ; به /docs بروید و یکی را خواهید دید که توسط Swagger UI (قدیمی‌تر، کمتر پیشرفته‌تر) ایجاد شده است. هر دو رابط کاربر اسناد قابل تنظیم هستند.

FastAPI همچنین قلاب‌هایی برای توسعه یا اصلاح خودکار ارائه می‌کند. طرحواره ایجاد شده، یا ایجاد آن به صورت مشروط یا حتی غیرفعال کردن آن.

fastapi

FastAPI به طور خودکار مشخصات OpenAPI را برای تمام نقاط پایانی ایجاد می کند، که می توانید از طریق یک رابط وب نیز به طور خودکار توسط FastAPI ایجاد شده با آنها تعامل داشته باشید. در صورت نیاز می توان این رابط را غیرفعال کرد.

نتیجه گیری

همانطور که پایتون تکامل می‌یابد و سازگار می‌شود، کتابخانه‌های مورد استفاده با آن برای کارهای رایج نیز تکامل می‌یابند. FastAPI ممکن است یکی از چارچوب‌های وب جدیدتر باشد، اما به لطف طراحی آینده‌نگر خود، در حال حاضر به شهرت زیادی دست یافته است. هر پروژه وب غیر پیش پا افتاده پایتون باید آن را به عنوان یک نامزد در نظر بگیرید.