কনটেন্টে যান

FastAPI

FastAPI

FastAPI উচ্চক্ষমতা সম্পন্ন, সহজে শেখার এবং দ্রুত কোড করে প্রোডাকশনের জন্য ফ্রামওয়ার্ক।

Test Coverage Package version


নির্দেশিকা নথি: https://fastapi.tiangolo.com

সোর্স কোড: https://github.com/fastapi/fastapi


FastAPI একটি আধুনিক, দ্রুত ( বেশি ক্ষমতা ) সম্পন্ন, Python 3.6+ দিয়ে API তৈরির জন্য স্ট্যান্ডার্ড পাইথন টাইপ ইঙ্গিত ভিত্তিক ওয়েব ফ্রেমওয়ার্ক।

এর মূল বৈশিষ্ট্য গুলো হলঃ

  • গতি: এটি NodeJS এবং Go এর মত কার্যক্ষমতা সম্পন্ন (Starlette এবং Pydantic এর সাহায্যে)। পাইথন এর দ্রুততম ফ্রেমওয়ার্ক গুলোর মধ্যে এটি একটি
  • দ্রুত কোড করা:বৈশিষ্ট্য তৈরির গতি ২০০% থেকে ৩০০% বৃদ্ধি করে৷ *
  • স্বল্প bugs: মানুব (ডেভেলপার) সৃষ্ট ত্রুটির প্রায় ৪০% হ্রাস করে। *
  • স্বজ্ঞাত: দুর্দান্ত এডিটর সাহায্য Completion নামেও পরিচিত। দ্রুত ডিবাগ করা যায়।

  • সহজ: এটি এমন ভাবে সজানো হয়েছে যেন নির্দেশিকা নথি পড়ে সহজে শেখা এবং ব্যবহার করা যায়।

  • সংক্ষিপ্ত: কোড পুনরাবৃত্তি কমানোর পাশাপাশি, bug কমায় এবং প্রতিটি প্যারামিটার ঘোষণা থেকে একাধিক ফিচার পাওয়া যায় ।
  • জোরালো: স্বয়ংক্রিয় ভাবে তৈরি ক্রিয়াশীল নির্দেশনা নথি (documentation) সহ উৎপাদন উপযোগি (Production-ready) কোড পাওয়া যায়।
  • মান-ভিত্তিক: এর ভিত্তি OpenAPI (যা পুর্বে Swagger নামে পরিচিত ছিল) এবং JSON Schema এর আদর্শের মানের ওপর

* উৎপাদনমুখি এপ্লিকেশন বানানোর এক দল ডেভেলপার এর মতামত ভিত্তিক ফলাফল।

স্পনসর গণ

অন্যান্য স্পনসর গণ

মতামত সমূহ

"আমি আজকাল FastAPI ব্যবহার করছি। [...] আমরা ভাবছি মাইক্রোসফ্টে ML সার্ভিস এ সকল দলের জন্য এটি ব্যবহার করব। যার মধ্যে কিছু পণ্য Windows এ সংযোযন হয় এবং কিছু Office এর সাথে সংযোযন হচ্ছে।"

কবির খান - মাইক্রোসফ্টে (ref)

"আমরা FastAPI লাইব্রেরি গ্রহণ করেছি একটি REST সার্ভার তৈরি করতে, যা ভবিষ্যদ্বাণী পাওয়ার জন্য কুয়েরি করা যেতে পারে। [লুডউইগের জন্য]"

পিয়েরো মোলিনো, ইয়ারোস্লাভ দুদিন, এবং সাই সুমন্থ মিরিয়ালা - উবার (ref)

"Netflix আমাদের ক্রাইসিস ম্যানেজমেন্ট অর্কেস্ট্রেশন ফ্রেমওয়ার্ক: ডিসপ্যাচ এর ওপেন সোর্স রিলিজ ঘোষণা করতে পেরে আনন্দিত! [যাকিনা FastAPI দিয়ে নির্মিত]"

কেভিন গ্লিসন, মার্ক ভিলানোভা, ফরেস্ট মনসেন - নেটফ্লিক্স (ref)

"আমি FastAPI নিয়ে চাঁদের সমান উৎসাহিত। এটি খুবই মজার!"

ব্রায়ান ওকেন - পাইথন বাইটস পডকাস্ট হোস্ট (ref)

"_সত্যিই, আপনি যা তৈরি করেছেন তা খুব মজবুত এবং পরিপূর্ন৷ অনেক উপায়ে, আমি যা Hug এ করতে চেয়েছিলাম - তা কাউকে তৈরি করতে দেখে আমি সত্যিই অনুপ্রানিত৷_"

টিমোথি ক্রসলে - Hug স্রষ্টা (ref)

"আপনি যদি REST API তৈরির জন্য একটি আধুনিক ফ্রেমওয়ার্ক শিখতে চান, তাহলে FastAPI দেখুন [...] এটি দ্রুত, ব্যবহার করা সহজ এবং শিখতেও সহজ [...]_"

"আমরা আমাদের APIs [...] এর জন্য FastAPI- তে এসেছি [...] আমি মনে করি আপনিও এটি পছন্দ করবেন [...]"

ইনেস মন্টানি - ম্যাথিউ হোনিবাল - Explosion AI প্রতিষ্ঠাতা - spaCy স্রষ্টা (ref) - (ref)

Typer, CLI এর জন্য FastAPI

আপনি যদি CLI অ্যাপ বানাতে চান, যা কিনা ওয়েব API এর পরিবর্তে টার্মিনালে ব্যবহার হবে, তাহলে দেখুনTyper.

টাইপার হল FastAPI এর ছোট ভাইয়ের মত। এবং এটির উদ্দেশ্য ছিল CLIs এর FastAPI হওয়া। ⌨️ 🚀

প্রয়োজনীয়তা গুলো

Python 3.7+

FastAPI কিছু দানবেদের কাঁধে দাঁড়িয়ে আছে:

  • Starlette ওয়েব অংশের জন্য.
  • Pydantic ডেটা অংশগুলির জন্য.

ইনস্টলেশন প্রক্রিয়া

$ pip install fastapi

---> 100%

আপনার একটি ASGI সার্ভারেরও প্রয়োজন হবে, প্রোডাকশনের জন্য Uvicorn অথবা Hypercorn.

$ pip install "uvicorn[standard]"

---> 100%

উদাহরণ

তৈরি

  • main.py নামে একটি ফাইল তৈরি করুন:
from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}
অথবা ব্যবহার করুন async def...

যদি আপনার কোড async / await, ব্যবহার করে তাহলে async def ব্যবহার করুন:

from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}

টীকা:

আপনি যদি না জানেন, "তাড়াহুড়ো?" বিভাগটি দেখুন async এবং await নথির মধ্যে দেখুন .

এটি চালান

সার্ভার চালু করুন:

$ uvicorn main:app --reload

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [28720]
INFO:     Started server process [28722]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
নির্দেশনা সম্পর্কে uvicorn main:app --reload...

uvicorn main:app নির্দেশনাটি দ্বারা বোঝায়:

  • main: ফাইল main.py (পাইথন "মডিউল")।
  • app: app = FastAPI() লাইন দিয়ে main.py এর ভিতরে তৈরি করা অবজেক্ট।
  • --reload: কোড পরিবর্তনের পরে সার্ভার পুনরায় চালু করুন। এটি শুধুমাত্র ডেভেলপমেন্ট এর সময় ব্যবহার করুন।

এটা চেক করুন

আপনার ব্রাউজার খুলুন http://127.0.0.1:8000/items/5?q=somequery এ।

আপনি JSON রেসপন্স দেখতে পাবেন:

{"item_id": 5, "q": "somequery"}

আপনি ইতিমধ্যে একটি API তৈরি করেছেন যা:

  • / এবং /items/{item_id} paths এ HTTP অনুরোধ গ্রহণ করে।
  • উভয় pathGET অপারেশন নেয় ( যা HTTP methods নামেও পরিচিত)।
  • path /items/{item_id}-এ একটি path প্যারামিটার item_id আছে যা কিনা int হতে হবে।
  • path /items/{item_id}-এর একটি ঐচ্ছিক str query প্যারামিটার q আছে।

ক্রিয়াশীল API নির্দেশিকা নথি

এখন যান http://127.0.0.1:8000/docs.

আপনি স্বয়ংক্রিয় ভাবে প্রস্তুত ক্রিয়াশীল API নির্দেশিকা নথি দেখতে পাবেন (Swagger UI প্রদত্ত):

Swagger UI

বিকল্প API নির্দেশিকা নথি

এবং এখন http://127.0.0.1:8000/redoc এ যান.

আপনি স্বয়ংক্রিয় ভাবে প্রস্তুত বিকল্প নির্দেশিকা নথি দেখতে পাবেন (ReDoc প্রদত্ত):

ReDoc

উদাহরণস্বরূপ আপগ্রেড

এখন main.py ফাইলটি পরিবর্তন করুন যেন এটি PUT রিকুয়েস্ট থেকে বডি পেতে পারে।

Python স্ট্যান্ডার্ড লাইব্রেরি, Pydantic এর সাহায্যে বডি ঘোষণা করুন।

from typing import Union

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    price: float
    is_offer: Union[bool, None] = None


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}


@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
    return {"item_name": item.name, "item_id": item_id}

সার্ভারটি স্বয়ংক্রিয়ভাবে পুনরায় লোড হওয়া উচিত (কারণ আপনি উপরের uvicorn কমান্ডে --reload যোগ করেছেন)।

ক্রিয়াশীল API নির্দেশিকা নথি উন্নীতকরণ

এখন http://127.0.0.1:8000/docs এডড্রেসে যান.

  • ক্রিয়াশীল API নির্দেশিকা নথিটি স্বয়ংক্রিয়ভাবে উন্নীত হযে যাবে, নতুন বডি সহ:

Swagger UI

  • "Try it out" বাটনে চাপুন, এটি আপনাকে পেরামিটারগুলো পূরণ করতে এবং API এর সাথে সরাসরি ক্রিয়া-কলাপ করতে দিবে:

Swagger UI interaction

  • তারপরে "Execute" বাটনে চাপুন, ব্যবহারকারীর ইন্টারফেস আপনার API এর সাথে যোগাযোগ করবে, পেরামিটার পাঠাবে, ফলাফলগুলি পাবে এবং সেগুলি পর্রদায় দেখাবে:

Swagger UI interaction

বিকল্প API নির্দেশিকা নথি আপগ্রেড

এবং এখন http://127.0.0.1:8000/redoc এ যান।

  • বিকল্প নির্দেশিকা নথিতেও নতুন কুয়েরি প্যারামিটার এবং বডি প্রতিফলিত হবে:

ReDoc

সংক্ষিপ্তকরণ

সংক্ষেপে, আপনি শুধু একবার প্যারামিটারের ধরন, বডি ইত্যাদি ফাংশন প্যারামিটার হিসেবে ঘোষণা করেন।

আপনি সেটি আধুনিক পাইথনের সাথে করেন।

আপনাকে নতুন করে নির্দিষ্ট কোন লাইব্রেরির বাক্য গঠন, ফাংশন বা ক্লাস কিছুই শিখতে হচ্ছে না।

শুধুই আধুনিক Python 3.6+

উদাহরণস্বরূপ, int এর জন্য:

item_id: int

অথবা আরও জটিল Item মডেলের জন্য:

item: Item

...এবং সেই একই ঘোষণার সাথে আপনি পাবেন:

  • এডিটর সাহায্য, যেমন
  • সমাপ্তি।
  • ধরণ যাচাই
  • তথ্য যাচাইকরণ:
  • ডেটা অবৈধ হলে স্বয়ংক্রিয় এবং পরিষ্কার ত্রুটির নির্দেশনা।
  • এমনকি গভীরভাবে নেস্ট করা JSON অবজেক্টের জন্য বৈধতা।
  • প্রেরিত তথ্য রূপান্তর: যা নেটওয়ার্ক থেকে পাইথনের তথ্য এবং ধরনে আসে, এবং সেখান থেকে পড়া:

  • JSON।

  • পাথ প্যারামিটার।
  • কুয়েরি প্যারামিটার।
  • কুকিজ
  • হেডার
  • ফর্ম
  • ফাইল

  • আউটপুট ডেটার রূপান্তর: পাইথন ডেটা এবং টাইপ থেকে নেটওয়ার্ক ডেটাতে রূপান্তর করা (JSON হিসাবে): -পাইথন টাইপে রূপান্তর করুন (str, int, float, bool, list, ইত্যাদি)।

  • datetime অবজেক্ট।
  • UUID objeঅবজেক্টcts।
  • ডাটাবেস মডেল।
  • ...এবং আরো অনেক।
  • স্বয়ংক্রিয় ক্রিয়াশীল API নির্দেশিকা নথি, 2টি বিকল্প ব্যবহারকারীর ইন্টারফেস সহ:
  • সোয়াগার ইউ আই (Swagger UI)।
  • রিডক (ReDoc)।

পূর্ববর্তী কোড উদাহরণে ফিরে আসা যাক, FastAPI যা করবে:

  • GET এবং PUT অনুরোধের জন্য পথে item_id আছে কিনা তা যাচাই করবে।
  • GET এবং PUT অনুরোধের জন্য item_id টাইপ int এর হতে হবে তা যাচাই করবে।
  • যদি না হয় তবে ক্লায়েন্ট একটি উপযুক্ত, পরিষ্কার ত্রুটি দেখতে পাবেন।
  • GET অনুরোধের জন্য একটি ঐচ্ছিক ক্যুয়েরি প্যারামিটার নামক q (যেমন http://127.0.0.1:8000/items/foo?q=somequery) আছে কি তা চেক করবে।
  • যেহেতু q প্যারামিটারটি = None দিয়ে ঘোষণা করা হয়েছে, তাই এটি ঐচ্ছিক।
  • None ছাড়া এটি প্রয়োজনীয় হতো (যেমন PUT এর ক্ষেত্রে হয়েছে)।
  • /items/{item_id} এর জন্য PUT অনুরোধের বডি JSON হিসাবে পড়ুন:
  • লক্ষ করুন, name একটি প্রয়োজনীয় অ্যাট্রিবিউট হিসাবে বিবেচনা করেছে এবং এটি str হতে হবে।
  • লক্ষ করুন এখানে, price অ্যাট্রিবিউটটি আবশ্যক এবং এটি float হতে হবে।
  • লক্ষ করুন is_offer একটি ঐচ্ছিক অ্যাট্রিবিউট এবং এটি bool হতে হবে যদি উপস্থিত থাকে।
  • এই সবটি গভীরভাবে অবস্থানরত JSON অবজেক্টগুলিতেও কাজ করবে।
  • স্বয়ংক্রিয়ভাবে JSON হতে এবং JSON থেকে কনভার্ট করুন।
  • OpenAPI দিয়ে সবকিছু ডকুমেন্ট করুন, যা ব্যবহার করা যেতে পারে:
  • ক্রিয়াশীল নির্দেশিকা নথি।
  • অনেক ভাষার জন্য স্বয়ংক্রিয় ক্লায়েন্ট কোড তৈরির ব্যবস্থা।
  • সরাসরি 2টি ক্রিয়াশীল নির্দেশিকা নথি ওয়েব পৃষ্ঠ প্রদান করা হয়েছে।

আমরা এতক্ষন শুধু এর পৃষ্ঠ তৈরি করেছি, কিন্তু আপনি ইতমধ্যেই এটি কিভাবে কাজ করে তার ধারণাও পেয়ে গিয়েছেন।

নিম্নোক্ত লাইন গুলো পরিবর্তন করার চেষ্টা করুন:

    return {"item_name": item.name, "item_id": item_id}

...পুর্বে:

        ... "item_name": item.name ...

...পরবর্তীতে:

        ... "item_price": item.price ...

...এবং দেখুন কিভাবে আপনার এডিটর উপাদানগুলোকে সয়ংক্রিয়ভাবে-সম্পন্ন করবে এবং তাদের ধরন জানতে পারবে:

editor support

আরও বৈশিষ্ট্য সম্পন্ন উদাহরণের জন্য, দেখুন টিউটোরিয়াল - ব্যবহারকারীর গাইড.

স্পয়লার সতর্কতা: টিউটোরিয়াল - ব্যবহারকারীর গাইড নিম্নোক্ত বিষয়গুলি অন্তর্ভুক্ত করে:

  • হেডার, কুকিজ, ফর্ম ফিল্ড এবং ফাইলগুলি এমন অন্যান্য জায়গা থেকে প্যারামিটার ঘোষণা করা।
  • maximum_length বা regex এর মতো যাচাইকরণ বাধামুক্তি সেট করা হয় কিভাবে, তা নিয়ে আলোচনা করা হবে।
  • একটি খুব শক্তিশালী এবং ব্যবহার করা সহজ ডিপেন্ডেন্সি ইনজেকশন পদ্ধতি
  • OAuth2 এবং JWT টোকেন এবং HTTP Basic auth সহ নিরাপত্তা এবং অনুমোদনপ্রাপ্তি সম্পর্কিত বিষয়সমূহের উপর।
  • গভীরভাবে অবস্থানরত JSON মডেল ঘোষণা করার জন্য আরও উন্নত (কিন্তু সমান সহজ) কৌশল (Pydantic কে ধন্যবাদ)।
  • আরো অতিরিক্ত বৈশিষ্ট্য (স্টারলেটকে ধন্যবাদ) হিসাবে:
  • WebSockets
  • GraphQL
  • HTTPX এবং pytest ভিত্তিক অত্যন্ত সহজ পরীক্ষা
  • CORS
  • Cookie Sessions
  • ...এবং আরো।

কর্মক্ষমতা

স্বাধীন TechEmpower Benchmarks দেখায় যে FastAPI অ্যাপ্লিকেশনগুলি Uvicorn-এর অধীনে চলমান দ্রুততমপাইথন ফ্রেমওয়ার্কগুলির মধ্যে একটি, শুধুমাত্র Starlette এবং Uvicorn-এর পর (FastAPI দ্বারা অভ্যন্তরীণভাবে ব্যবহৃত)। (*)

এটি সম্পর্কে আরও বুঝতে, দেখুন Benchmarks.

ঐচ্ছিক নির্ভরশীলতা

Pydantic দ্বারা ব্যবহৃত:

  • email-validator - ইমেল যাচাইকরণের জন্য।

স্টারলেট দ্বারা ব্যবহৃত:

  • httpx - আপনি যদি TestClient ব্যবহার করতে চান তাহলে আবশ্যক।
  • jinja2 - আপনি যদি প্রদত্ত টেমপ্লেট রূপরেখা ব্যবহার করতে চান তাহলে প্রয়োজন।
  • python-multipart - আপনি যদি ফর্ম সহায়তা করতে চান তাহলে প্রয়োজন "parsing", request.form() সহ।
  • itsdangerous - SessionMiddleware সহায়তার জন্য প্রয়োজন।
  • pyyaml - স্টারলেটের SchemaGenerator সাপোর্ট এর জন্য প্রয়োজন (আপনার সম্ভাবত FastAPI প্রয়োজন নেই)।
  • graphene - GraphQLApp সহায়তার জন্য প্রয়োজন।

FastAPI / Starlette দ্বারা ব্যবহৃত:

  • uvicorn - সার্ভারের জন্য যা আপনার অ্যাপ্লিকেশন লোড করে এবং পরিবেশন করে।
  • orjson - আপনি ORJSONResponse ব্যবহার করতে চাইলে প্রয়োজন।
  • ujson - আপনি UJSONResponse ব্যবহার করতে চাইলে প্রয়োজন।

আপনি এই সব ইনস্টল করতে পারেন pip install fastapi[all] দিয়ে.

লাইসেন্স

এই প্রজেক্ট MIT লাইসেন্স নীতিমালার অধীনে শর্তায়িত।