🌐 Detecting your location…

FastAPI के साथ REST API कैसे बनाएं

⏱️3 min read  ·  461 words

How to Build a REST API with FastAPI

फास्टएपीआई नए पायथन एपीआई के लिए डिफ़ॉल्ट विकल्प बन गया है, और अच्छे कारण के लिए: स्वचालित ओपनएपीआई दस्तावेज़, वास्तविक एसिंक समर्थन, और पाइडेंटिक द्वारा संचालित अनुरोध सत्यापन जो आपके व्यावसायिक तर्क को छूने से पहले खराब इनपुट को पकड़ लेता है। यह ट्यूटोरियल एक खाली फ़ोल्डर से प्रमाणीकरण-तैयार संरचना के साथ डेटाबेस-समर्थित CRUD सेवा के लिए एक कार्यशील REST API बनाता है।

सामग्री तालिका

प्रोजेक्ट सेटअप

एक आभासी वातावरण बनाएं और कोर पैकेज स्थापित करें:

mkdir fastapi-todo && cd fastapi-todo
python3 -m venv venv
source venv/bin/activate

pip install fastapi uvicorn[standard] sqlmodel

uvicornएएसजीआई सर्वर है जो वास्तव में आपका ऐप चलाता है;sqlmodelएक डेटाबेस परत के लिए SQLAlchemy और Pydantic को जोड़ती है जो आपके API स्कीमा के साथ मॉडल साझा करती है।

आपका पहला मार्ग

बनाएँmain.py:

from fastapi import FastAPI

app = FastAPI(title="Todo API")

@app.get("/")
def read_root():
    return {"message": "Todo API is running"}

इसे हॉट रीलोड के साथ चलाएँ:

uvicorn main:app --reload

विजिटhttp://127.0.0.1:8000और आपको JSON प्रतिक्रिया दिखाई देगी. विजिट/docsऔर आपके पास पहले से ही एक इंटरैक्टिव स्वैगर यूआई है – जो आपके फ़ंक्शन हस्ताक्षरों के अलावा किसी और चीज़ से उत्पन्न नहीं हुआ है।

पाइडेंटिक के साथ अनुरोध और प्रतिक्रिया मॉडल

मैन्युअल रूप से जांचने के बजायrequest.json()छूटे हुए फ़ील्ड के लिए, एक मॉडल परिभाषित करें और FastAPI को आपके लिए मान्य करने दें:

from pydantic import BaseModel

class TodoCreate(BaseModel):
    title: str
    done: bool = False

@app.post("/todos")
def create_todo(todo: TodoCreate):
    return {"title": todo.title, "done": todo.done}

अनुरोध भेजें अनुपलब्धtitleऔर फास्टएपीआई स्वचालित रूप से एक संरचित 422 त्रुटि लौटाता है – कोई अतिरिक्त कोड की आवश्यकता नहीं है। यह सत्यापन परत टीमों के फ्लास्क से स्थानांतरित होने का सबसे बड़ा कारण है।

SQLModel के साथ एक डेटाबेस जोड़ना

SQLModel एक वर्ग को आपकी डेटाबेस तालिका और आपकी API स्कीमा दोनों के रूप में कार्य करने देता है:

from sqlmodel import SQLModel, Field, create_engine, Session

class Todo(SQLModel, table=True):
    id: int | None = Field(default=None, primary_key=True)
    title: str
    done: bool = False

engine = create_engine("sqlite:///todos.db")

def init_db():
    SQLModel.metadata.create_all(engine)

def get_session():
    with Session(engine) as session:
        yield session

कॉल करेंinit_db()फास्टएपीआई के जीवनकाल हैंडलर का उपयोग करके स्टार्टअप पर:

from contextlib import asynccontextmanager

@asynccontextmanager
async def lifespan(app: FastAPI):
    init_db()
    yield

app = FastAPI(title="Todo API", lifespan=lifespan)

पूर्ण सीआरयूडी समापन बिंदुओं का निर्माण

मॉडल और सत्र निर्भरता के साथ, चार सीआरयूडी ऑपरेशन छोटे और पठनीय हैं:

from fastapi import Depends, HTTPException
from sqlmodel import select

@app.post("/todos", response_model=Todo)
def create_todo(todo: Todo, session: Session = Depends(get_session)):
    session.add(todo)
    session.commit()
    session.refresh(todo)
    return todo

@app.get("/todos", response_model=list[Todo])
def list_todos(session: Session = Depends(get_session)):
    return session.exec(select(Todo)).all()

@app.get("/todos/{todo_id}", response_model=Todo)
def get_todo(todo_id: int, session: Session = Depends(get_session)):
    todo = session.get(Todo, todo_id)
    if not todo:
        raise HTTPException(status_code=404, detail="Todo not found")
    return todo

@app.put("/todos/{todo_id}", response_model=Todo)
def update_todo(todo_id: int, data: Todo, session: Session = Depends(get_session)):
    todo = session.get(Todo, todo_id)
    if not todo:
        raise HTTPException(status_code=404, detail="Todo not found")
    todo.title = data.title
    todo.done = data.done
    session.add(todo)
    session.commit()
    session.refresh(todo)
    return todo

@app.delete("/todos/{todo_id}")
def delete_todo(todo_id: int, session: Session = Depends(get_session)):
    todo = session.get(Todo, todo_id)
    if not todo:
        raise HTTPException(status_code=404, detail="Todo not found")
    session.delete(todo)
    session.commit()
    return {"ok": True}

सूचनाDepends(get_session)– फास्टएपीआई की निर्भरता इंजेक्शन प्रणाली। यह चलता हैget_sessionप्रत्येक अनुरोध के लिए, परिणाम को आपके फ़ंक्शन को सौंपता है, और बाद में इसे साफ़ करता है। प्रत्येक हैंडलर में बॉयलरप्लेट को दोहराए बिना प्रमाणीकरण, दर सीमित करने और पेजिनेशन के लिए समान पैटर्न स्केल होता है।

त्रुटि प्रबंधन

HTTPExceptionअधिकांश मामलों को कवर करता है, लेकिन डोमेन-विशिष्ट त्रुटियों के लिए, एक कस्टम अपवाद हैंडलर पंजीकृत करें ताकि प्रतिक्रियाएं एपीआई में सुसंगत रहें:

from fastapi.responses import JSONResponse
from fastapi import Request

class TodoLimitError(Exception):
    pass

@app.exception_handler(TodoLimitError)
def limit_handler(request: Request, exc: TodoLimitError):
    return JSONResponse(status_code=400, content={"error": "todo limit reached"})

स्वचालित दस्तावेज़

आपके द्वारा लिखा गया प्रत्येक मार्ग पहले से ही/docsपर प्रलेखित है (स्वैगर) और/redoc(ReDoc), आपके पाइडेंटिक मॉडल और प्रकार के संकेतों से उत्पन्न होता है। डॉकस्ट्रिंग याField(description=...)के साथ विवरण जोड़ें और वे स्वचालित रूप से जेनरेट किए गए स्कीमा में दिखाई देते हैं – हाथ से बनाए रखने के लिए कोई अलग ओपनएपीआई वाईएएमएल नहीं है।

उत्पादन में चल रहा है

उत्पादन के लिए, कई श्रमिकों के साथ गुनिकॉर्न के पीछे यूविकॉर्न चलाएं, या यूविकॉर्न के स्वयं के मल्टी-वर्कर मोड का उपयोग करें:

gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000

इसे TLS समाप्ति के लिए Nginx या एक प्रबंधित लोड बैलेंसर के पीछे रखें, औरcreate_engineको बदलकर PostgreSQL के लिए SQLite को स्वैप करें। कनेक्शन स्ट्रिंग – SQLModel का API नहीं बदलता है।

यदि आप इस एपीआई को आधुनिक फ्रंटएंड के साथ जोड़ रहे हैं, तो हमाराNext.js 15 और PostgreSQL गाइडक्लाइंट पक्ष को कवर करता है, और जावास्क्रिप्ट में एसिंक फंडामेंटल के लिए,देखें हमारा एसिंक/प्रतीक्षा गहन गोता.

अक्सर पूछे जाने वाले प्रश्न

क्या फास्टएपीआई फ्लास्क से तेज है?
फास्टएपीआई का एसिंक सपोर्ट और स्टारलेट फाउंडेशन इसे समवर्ती लोड के तहत काफी तेज बनाता है, खासकर डेटाबेस कॉल या बाहरी एपीआई अनुरोध जैसे I/O-बाउंड एंडपॉइंट के लिए।

क्या मुझे प्रत्येक रूट के लिए async def की आवश्यकता है?
नहीं, फास्टएपीआई सिंक्रोनस चलता हैdefस्वचालित रूप से थ्रेड पूल में रूट करें।async defका प्रयोग करें जब आप वास्तविक समवर्ती लाभ प्राप्त करने के लिए async लाइब्रेरीज़ (async DB ड्राइवर, httpx) को कॉल कर रहे हों।

पाइडेंटिक और SQLModel के बीच क्या अंतर है?
पाइडेंटिक अनुरोधों और प्रतिक्रियाओं के लिए डेटा आकृतियों को मान्य करता है। SQLModel पाइडेंटिक मॉडल का विस्तार करता है ताकि वही क्लास डुप्लिकेट स्कीमा परिभाषाओं से बचते हुए डेटाबेस तालिका में भी मैप कर सके।

मैं प्रमाणीकरण कैसे जोड़ूँ?
फास्टएपीआई का उपयोग करेंOAuth2PasswordBearerनिर्भरता इंजेक्शन के साथ – एget_current_userनिर्भरता एक JWT को मान्य करती है और प्रमाणीकरण तर्क को एक स्थान पर रखते हुए, सुरक्षा की आवश्यकता वाले किसी भी मार्ग में जोड़ा जाता है।

क्या फास्टएपीआई वेबसॉकेट को संभाल सकता है?
हाँ, मूल रूप से.@app.websocket("/ws")के साथ एक मार्ग परिभाषित करें और एकasync defहैंडलर जो प्रतीक्षा कर रहा हैwebsocket.receive_text()एक पाश में.

निर्माण के लिए तैयार हैं?

उपरोक्त कोड को एक नए प्रोजेक्ट में क्लोन करें,uvicorn main:app --reloadचलाएँ , और नियत तिथियों या प्राथमिकता जैसे क्षेत्रों के साथ टोडो मॉडल का विस्तार करना शुरू करें। आपने डेटाबेस सत्र के लिए जिस निर्भरता इंजेक्शन पैटर्न का उपयोग किया था, वही पैटर्न आप बाद में प्रमाणीकरण, कैशिंग और दर सीमित करने के साथ प्राप्त करेंगे।

टीपी
टेकपल्स टीम
1 अगस्त 2026 को प्रकाशित


MD Rafikul Islam

Written by

MD Rafikul Islam is a software developer and the editor of TechPulse. He writes about developer tooling, hardware, and the practical decisions that come up in day-to-day engineering work — which laptop to buy, which framework to commit to, why a build broke at 2am. He tests the tools he writes about and says plainly when something is not worth the money. Corrections and corrections requests are welcome at rony.yf25@gmail.com.

✍️ Leave a Comment

Your email address will not be published. Required fields are marked *

🌐 Read in:🇬🇧 English🇩🇪 Deutsch🇧🇷 Português🇸🇦 العربية🇮🇳 हिन्दी🇧🇩 বাংলা