FastAPI
FastAPI উচ্চক্ষমতা সম্পন্ন, সহজে শেখার এবং দ্রুত কোড করে প্রোডাকশনের জন্য ফ্রামওয়ার্ক।
নির্দেশিকা নথি: https://fastapi.tiangolo.com
সোর্স কোড: https://github.com/tiangolo/fastapi
FastAPI একটি আধুনিক, দ্রুত ( বেশি ক্ষমতা ) সম্পন্ন, Python 3.6+ দিয়ে API তৈরির জন্য স্ট্যান্ডার্ড পাইথন টাইপ ইঙ্গিত ভিত্তিক ওয়েব ফ্রেমওয়ার্ক।
এর মূল বৈশিষ্ট্য গুলো হলঃ
- গতি: এটি NodeJS এবং Go এর মত কার্যক্ষমতা সম্পন্ন (Starlette এবং Pydantic এর সাহায্যে)। পাইথন এর দ্রুততম ফ্রেমওয়ার্ক গুলোর মধ্যে এটি একটি।
- দ্রুত কোড করা:বৈশিষ্ট্য তৈরির গতি ২০০% থেকে ৩০০% বৃদ্ধি করে৷ *
- স্বল্প bugs: মানুব (ডেভেলপার) সৃষ্ট ত্রুটির প্রায় ৪০% হ্রাস করে। *
-
স্বজ্ঞাত: দুর্দান্ত এডিটর সাহায্য Completion নামেও পরিচিত। দ্রুত ডিবাগ করা যায়।
-
সহজ: এটি এমন ভাবে সজানো হয়েছে যেন নির্দেশিকা নথি পড়ে সহজে শেখা এবং ব্যবহার করা যায়।
- সংক্ষিপ্ত: কোড পুনরাবৃত্তি কমানোর পাশাপাশি, bug কমায় এবং প্রতিটি প্যারামিটার ঘোষণা থেকে একাধিক ফিচার পাওয়া যায় ।
- জোরালো: স্বয়ংক্রিয় ভাবে তৈরি ক্রিয়াশীল নির্দেশনা নথি (documentation) সহ উৎপাদন উপযোগি (Production-ready) কোড পাওয়া যায়।
- মান-ভিত্তিক: এর ভিত্তি OpenAPI (যা পুর্বে Swagger নামে পরিচিত ছিল) এবং JSON Schema এর আদর্শের মানের ওপর
* উৎপাদনমুখি এপ্লিকেশন বানানোর এক দল ডেভেলপার এর মতামত ভিত্তিক ফলাফল।
স্পনসর গণ¶
মতামত সমূহ¶
"আমি আজকাল FastAPI ব্যবহার করছি। [...] আমরা ভাবছি মাইক্রোসফ্টে ML সার্ভিস এ সকল দলের জন্য এটি ব্যবহার করব। যার মধ্যে কিছু পণ্য Windows এ সংযোযন হয় এবং কিছু Office এর সাথে সংযোযন হচ্ছে।"
"আমরা FastAPI লাইব্রেরি গ্রহণ করেছি একটি REST সার্ভার তৈরি করতে, যা ভবিষ্যদ্বাণী পাওয়ার জন্য কুয়েরি করা যেতে পারে। [লুডউইগের জন্য]"
"Netflix আমাদের ক্রাইসিস ম্যানেজমেন্ট অর্কেস্ট্রেশন ফ্রেমওয়ার্ক: ডিসপ্যাচ এর ওপেন সোর্স রিলিজ ঘোষণা করতে পেরে আনন্দিত! [যাকিনা FastAPI দিয়ে নির্মিত]"
"আমি FastAPI নিয়ে চাঁদের সমান উৎসাহিত। এটি খুবই মজার!"
"_সত্যিই, আপনি যা তৈরি করেছেন তা খুব মজবুত এবং পরিপূর্ন৷ অনেক উপায়ে, আমি যা Hug এ করতে চেয়েছিলাম - তা কাউকে তৈরি করতে দেখে আমি সত্যিই অনুপ্রানিত৷_"
"আপনি যদি REST API তৈরির জন্য একটি আধুনিক ফ্রেমওয়ার্ক শিখতে চান, তাহলে FastAPI দেখুন [...] এটি দ্রুত, ব্যবহার করা সহজ এবং শিখতেও সহজ [...]_"
"আমরা আমাদের APIs [...] এর জন্য FastAPI- তে এসেছি [...] আমি মনে করি আপনিও এটি পছন্দ করবেন [...]"
Typer, CLI এর জন্য FastAPI¶
আপনি যদি CLI অ্যাপ বানাতে চান, যা কিনা ওয়েব API এর পরিবর্তে টার্মিনালে ব্যবহার হবে, তাহলে দেখুনTyper.
টাইপার হল FastAPI এর ছোট ভাইয়ের মত। এবং এটির উদ্দেশ্য ছিল CLIs এর FastAPI হওয়া। ⌨️ 🚀
প্রয়োজনীয়তা গুলো¶
Python 3.7+
FastAPI কিছু দানবেদের কাঁধে দাঁড়িয়ে আছে:
ইনস্টলেশন প্রক্রিয়া¶
$ 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 অনুরোধ গ্রহণ করে।- উভয় pathই
GET
অপারেশন নেয় ( যা 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 প্রদত্ত):
বিকল্প API নির্দেশিকা নথি¶
এবং এখন http://127.0.0.1:8000/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 নির্দেশিকা নথিটি স্বয়ংক্রিয়ভাবে উন্নীত হযে যাবে, নতুন বডি সহ:
- "Try it out" বাটনে চাপুন, এটি আপনাকে পেরামিটারগুলো পূরণ করতে এবং API এর সাথে সরাসরি ক্রিয়া-কলাপ করতে দিবে:
- তারপরে "Execute" বাটনে চাপুন, ব্যবহারকারীর ইন্টারফেস আপনার API এর সাথে যোগাযোগ করবে, পেরামিটার পাঠাবে, ফলাফলগুলি পাবে এবং সেগুলি পর্রদায় দেখাবে:
বিকল্প API নির্দেশিকা নথি আপগ্রেড¶
এবং এখন http://127.0.0.1:8000/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 ...
...এবং দেখুন কিভাবে আপনার এডিটর উপাদানগুলোকে সয়ংক্রিয়ভাবে-সম্পন্ন করবে এবং তাদের ধরন জানতে পারবে:
আরও বৈশিষ্ট্য সম্পন্ন উদাহরণের জন্য, দেখুন টিউটোরিয়াল - ব্যবহারকারীর গাইড.
স্পয়লার সতর্কতা: টিউটোরিয়াল - ব্যবহারকারীর গাইড নিম্নোক্ত বিষয়গুলি অন্তর্ভুক্ত করে:
- হেডার, কুকিজ, ফর্ম ফিল্ড এবং ফাইলগুলি এমন অন্যান্য জায়গা থেকে প্যারামিটার ঘোষণা করা।
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 দ্বারা ব্যবহৃত:
ujson
- দ্রুত JSON এর জন্য "parsing".email_validator
- ইমেল যাচাইকরণের জন্য।
স্টারলেট দ্বারা ব্যবহৃত:
httpx
- আপনি যদিTestClient
ব্যবহার করতে চান তাহলে আবশ্যক।jinja2
- আপনি যদি প্রদত্ত টেমপ্লেট রূপরেখা ব্যবহার করতে চান তাহলে প্রয়োজন।python-multipart
- আপনি যদি ফর্ম সহায়তা করতে চান তাহলে প্রয়োজন "parsing",request.form()
সহ।itsdangerous
-SessionMiddleware
সহায়তার জন্য প্রয়োজন।pyyaml
- স্টারলেটের SchemaGenerator সাপোর্ট এর জন্য প্রয়োজন (আপনার সম্ভাবত FastAPI প্রয়োজন নেই)।graphene
-GraphQLApp
সহায়তার জন্য প্রয়োজন।ujson
- আপনিUJSONResponse
ব্যবহার করতে চাইলে প্রয়োজন।
FastAPI / Starlette দ্বারা ব্যবহৃত:
uvicorn
- সার্ভারের জন্য যা আপনার অ্যাপ্লিকেশন লোড করে এবং পরিবেশন করে।orjson
- আপনিORJSONResponse
ব্যবহার করতে চাইলে প্রয়োজন।
আপনি এই সব ইনস্টল করতে পারেন pip install fastapi[all]
দিয়ে.
লাইসেন্স¶
এই প্রজেক্ট MIT লাইসেন্স নীতিমালার অধীনে শর্তায়িত।