FastAPI প্রকল্প কাঠামো এবং সর্বোত্তম অনুশীলন নির্দেশিকা

সর্বশেষ আপডেট: 12/27/2025
লেখক: C SourceTrail
  • প্রকল্পের আকার, স্থাপত্য এবং দলের চাহিদার উপর ভিত্তি করে ফাইল-টাইপ এবং বৈশিষ্ট্য-ভিত্তিক লেআউটের মধ্যে বেছে নিন, ধারাবাহিকতাকে সর্বোচ্চ অগ্রাধিকার হিসাবে রাখুন।
  • রাউটিং পাতলা, লজিক মডুলার এবং ভ্যালিডেশন শক্তিশালী এবং পুনঃব্যবহারযোগ্য রাখার জন্য FastAPI-এর টাইপ ইঙ্গিত, পাইড্যান্টিক মডেল এবং নির্ভরতা ইনজেকশন ব্যবহার করুন।
  • কাঠামোগত নিরাপত্তা, পরীক্ষা, অ্যাসিঙ্ক I/O এবং কনফিগারেশনকে প্রথম-শ্রেণীর উদ্বেগ হিসেবে বিবেচনা করুন যাতে উৎপাদন এবং একাধিক দলে স্কেলিংয়ের জন্য সম্পূর্ণ পুনর্লিখনের প্রয়োজন না হয়।
  • সময়ের সাথে সাথে ক্রমবর্ধমান FastAPI মনোলিথ বা মাইক্রোসার্ভিস ফ্লিটকে রক্ষণাবেক্ষণযোগ্য রাখতে স্পষ্ট নামকরণ, মাইগ্রেশন এবং টুলিং নিয়মাবলী গ্রহণ করুন।

FastAPI প্রকল্প কাঠামোর সর্বোত্তম অনুশীলন

একটি FastAPI প্রকল্পের জন্য একটি পরিষ্কার, স্কেলেবল কাঠামো ডিজাইন করা সেই সিদ্ধান্তগুলির মধ্যে একটি যা শুরুতে ছোটখাটো মনে হয় কিন্তু ছয় মাস পরে আপনার জীবনকে সম্পূর্ণরূপে বদলে দেয়।, যখন কোডবেস বৃদ্ধি পেয়েছে, তখন টিমটি প্রসারিত হয়েছে এবং আপনি একাধিক মডিউল জুড়ে একটি বাগ ট্রেস করার চেষ্টা করছেন। একটি ভাল লেআউট অনবোর্ডিংকে ত্বরান্বিত করে, রিগ্রেশন কমায় এবং রিফ্যাক্টরগুলিকে অনেক কম বেদনাদায়ক করে তোলে।

FastAPI আপনাকে প্রচুর নমনীয়তা দেয়, কিন্তু এর অর্থ হল আপনাকে সক্রিয়ভাবে নিয়মাবলী নির্বাচন এবং প্রয়োগ করতে হবে।। এই নির্দেশিকায় আমরা বাস্তব জগত, উৎপাদন FastAPI প্রকল্প এবং সুপরিচিত সেরা অনুশীলন সংগ্রহস্থল থেকে সবচেয়ে কার্যকর ধারণাগুলি একত্রিত করব, মূল প্রকল্প লেআউটগুলির তুলনা করব এবং দেখব যে তারা নির্ভরতা ইনজেকশন, বৈধতা, অ্যাসিঙ্ক I/O, পরীক্ষা এবং স্থাপনার মতো মূল FastAPI ধারণাগুলির সাথে কীভাবে ইন্টারঅ্যাক্ট করে।

FastAPI-তে প্রকল্প কাঠামো কেন এত গুরুত্বপূর্ণ

একটি শক্ত কাঠামো হল মেরুদণ্ড যা একটি FastAPI অ্যাপ্লিকেশনকে আকার এবং জটিলতায় বৃদ্ধির সাথে সাথে বোধগম্য রাখে।। এটি ছাড়া, দুর্দান্ত এর্গোনমিক্স সহ একটি কাঠামোও দ্রুত অ্যাড-হক মডিউল, বৃত্তাকার আমদানি এবং ডুপ্লিকেট লজিকের স্তূপে পরিণত হয়।

প্রকৌশলগত দৃষ্টিকোণ থেকে, কাঠামো সরাসরি স্কেলেবিলিটিকে প্রভাবিত করে: যখন মডিউলগুলি আলাদা করা হয় এবং দায়িত্বগুলি স্পষ্ট হয়, তখন আপনি সবকিছু পুনর্লিখন না করেই পরিষেবাগুলি বিভক্ত করতে পারেন, সারি প্রবর্তন করতে পারেন বা সিস্টেমের বিভিন্ন অংশ স্বাধীনভাবে স্কেল করতে পারেন।

রক্ষণাবেক্ষণযোগ্যতা আরেকটি বড় জয়। যখন প্রতিটি রুট, স্কিমা এবং ডাটাবেস মডেলের একটি পূর্বাভাসযোগ্য ঘর থাকে, তখন ডেভেলপাররা ফাইল অনুসন্ধানে কম সময় নষ্ট করে এবং প্রকৃত ব্যবসায়িক সমস্যা সমাধানে বেশি সময় নষ্ট করে। কোড পর্যালোচনা করাও সহজ হয়ে যায় কারণ প্রত্যেকের মানসিক মডেল একই রকম।

টিম প্রকল্পগুলিতে, একটি সামঞ্জস্যপূর্ণ বিন্যাস সহযোগিতাকে ব্যাপকভাবে উন্নত করে। নতুন নিয়োগপ্রাপ্তরা নতুন বৈশিষ্ট্যগুলি কোথায় স্থাপন করতে হবে তা অনুমান করতে পারে, QA পরীক্ষার জন্য সঠিক এন্ট্রি পয়েন্টগুলি আবিষ্কার করতে পারে এবং DevOps বুঝতে পারে অ্যাপটি বুট করার জন্য কোন অংশগুলি গুরুত্বপূর্ণ (উদাহরণস্বরূপ, ASGI অ্যাপ অবজেক্টটি কোথায় থাকে এবং ডাটাবেস কীভাবে তারযুক্ত)।

FastAPI ফোল্ডার লেআউটের চিত্রণ

ফাস্টএপিআই প্রকল্প গঠনের মূল নীতিগুলি

ফোল্ডার লেআউট বেছে নেওয়ার আগে, কিছু নীতির উপর একমত হওয়া সাহায্য করে যা যেকোনো স্থাপত্য সিদ্ধান্তের পথ নির্দেশ করবে।। সফল FastAPI কোডবেসে এই ধারণাগুলি বারবার দেখা যায়।

উদ্বেগের বিচ্ছেদ প্রথম স্তম্ভ হল: রাউটিং, স্থায়িত্ব, ব্যবসায়িক নিয়ম এবং ইন্টিগ্রেশন কোড বিভিন্ন স্থানে রাখুন। এন্ডপয়েন্টগুলি ব্যবহারের ক্ষেত্রে সাজানো উচিত, SQL কোয়েরি, JSON ম্যানিপুলেশন এবং বহিরাগত পরিষেবা কলগুলিকে একটি দীর্ঘ ফাংশনে এম্বেড করা উচিত নয়।

মডুলারিটি হল দ্বিতীয় স্তম্ভ। একটি বিশাল একমুখী প্যাকেজের পরিবর্তে, ছোট, ফোকাসড মডিউল বা সাবপ্যাকেজগুলির জন্য লক্ষ্য রাখুন যা সম্পর্কিত আচরণকে ধারণ করে। এটি টুকরোগুলি পুনরায় ব্যবহার করা, বিচ্ছিন্নভাবে পরীক্ষা করা এবং প্রয়োজনে অবশেষে মাইক্রোসার্ভিসে বিভক্ত করা অনেক সহজ করে তোলে।

ডিপেন্ডেন্সি ইনজেকশন হল সেই আঠা যা টাইট কাপলিং ছাড়াই মডিউলগুলিকে সংযুক্ত করে। FastAPI এর নির্ভরতা সিস্টেম আপনাকে একটি রুট বা পরিষেবার কী প্রয়োজন (ডাটাবেস সেশন, কনফিগারেশন, প্রমাণীকৃত ব্যবহারকারী, ইত্যাদি) তা ঘোষণা করতে এবং ফ্রেমওয়ার্ককে তা প্রদান করতে দেয়, যা পরীক্ষাযোগ্যতা এবং পুনঃব্যবহারের জন্য আদর্শ।

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

দুটি প্রভাবশালী FastAPI প্রকল্প লেআউট: ফাইলের ধরণ অনুসারে বনাম বৈশিষ্ট্য অনুসারে

FastAPI ইকোসিস্টেমে আপনি সাধারণত দুটি স্পষ্ট লেআউট পরিবার পাবেন: ফাইলের ধরণ (রাউটার, মডেল, স্কিমা, CRUD) অনুসারে সংগঠিত প্রকল্প এবং ডোমেন বা বৈশিষ্ট্য (auth, ব্যবহারকারী, পোস্ট, পেমেন্ট, ইত্যাদি) অনুসারে সংগঠিত প্রকল্প। প্রতিটি ভিন্ন প্রেক্ষাপটে উজ্জ্বল।

ফাইল-টাইপ-ভিত্তিক কাঠামো (রাউটার, স্কিমা, মডেল, CRUD)

ফাইল-টাইপ পদ্ধতিটি কতগুলি অফিসিয়াল উদাহরণ এবং টিউটোরিয়াল FastAPI-এর সাথে পরিচয় করিয়ে দেয় তা প্রতিফলিত করে।। আপনি কোডকে তার কারিগরি ভূমিকা অনুসারে গ্রুপ করেন: রাউটিং লেয়ার, পাইড্যান্টিক স্কিমা, ডাটাবেস মডেল, CRUD অপারেশন, ইউটিলিটি ইত্যাদি।

একটি ন্যূনতম কিন্তু বাস্তবসম্মত লেআউট এইরকম দেখতে হতে পারে (স্পষ্টতার জন্য সংক্ষিপ্ত করা হয়েছে):

উদাহরণ লেআউট: .├── app
│ ├── __init__.py
│ ├── main.py # FastAPI app initialization
│ ├── dependencies.py # shared dependencies
│ ├── routers
│ │ ├── __init__.py
│ │ ├── items.py # endpoints for items
│ │ └── users.py # endpoints for users
│ ├── crud
│ │ ├── item.py # item CRUD
│ │ └── user.py # user CRUD
│ ├── schemas
│ │ ├── item.py # pydantic models for items
│ │ └── user.py # pydantic models for users
│ ├── models
│ │ ├── item.py # ORM models for items
│ │ └── user.py # ORM models for users
│ ├── external_services
│ │ ├── email.py # email provider client
│ │ └── notification.py # push / notification client
│ └── utils
│ ├── authentication.py
│ └── validation.py
├── tests
│ ├── test_main.py
│ ├── test_items.py
│ └── test_users.py
├── requirements.txt
└── README.md

এই স্টাইলে, প্রতিটি শীর্ষ-স্তরের ডিরেক্টরি অধীনে app/ একটি মাত্র দায়িত্ব আছে। উদাহরণ স্বরূপ, routers/ HTTP এন্ট্রি পয়েন্ট বর্ণনা করে, schemas/ ইনপুট/আউটপুট আকার ঘোষণা করে এবং models/ ডাটাবেস টেবিল উপস্থাপন করুন।

এই লেআউটটি ছোট থেকে মাঝারি পরিষেবা বা মাইক্রোসার্ভিসের জন্য অত্যন্ত ভালোভাবে কাজ করে।। ডোমেনটি সাধারণত এতটাই সংকীর্ণ যে কারিগরি ভূমিকা অনুসারে বিভাজন ঘর্ষণ তৈরি করে না। বেশিরভাগ এন্ডপয়েন্ট একই সীমিত মডেল সেট ব্যবহার করে এবং একই সময়ে কোডটি স্পর্শ করে মাত্র কয়েকটি দল।

ফাইল-টাইপ কাঠামোর মূল সুবিধাগুলির মধ্যে রয়েছে নতুনদের জন্য খুব কম জ্ঞানীয় লোড এবং একটি ডিরেক্টরি ট্রি যা FastAPI-এর ডকুমেন্টেশন ঘনিষ্ঠভাবে অনুসরণ করে। ফ্রেমওয়ার্ক শেখার জন্য, একটি ডেডিকেটেড routers/ ফোল্ডার এবং ক schemas/ ডোমেইন-চালিত প্যাকেজিংয়ে সরাসরি ঝাঁপিয়ে পড়ার চেয়ে ফোল্ডারটি প্রায়শই বেশি স্বজ্ঞাত মনে হয়।

বৈশিষ্ট্য-অথবা মডিউল-ভিত্তিক কাঠামোর অধীনে src/

প্রকল্পগুলি যখন অনেক ডোমেন সহ মনোলিথে পরিণত হয়, তখন ফাইল-টাইপ লেআউটটি ক্রিক করতে শুরু করে. আপনি বিশাল ডিরেক্টরি পাবেন যেমন routers/ ডজন ডজন ফাইল, জটিল ক্রস-মডিউল আমদানি এবং সম্পর্কহীন প্যাকেজগুলিতে ছড়িয়ে ছিটিয়ে থাকা ব্যবসায়িক যুক্তি সহ।

একটি বিকল্প যা আরও ভালোভাবে পরিমাপ করে তা হল বৈশিষ্ট্য-ভিত্তিক, অথবা ডোমেইন-চালিত, কাঠামো। এখানে আপনি একটি নির্দিষ্ট ডোমেনের জন্য সমস্ত কোড একটি সাবপ্যাকেজে রাখবেন: রুট, স্কিমা, মডেল, পরিষেবা, কনফিগারেশন এবং মডিউল-নির্দিষ্ট ব্যতিক্রম।

জনপ্রিয় সেরা অনুশীলন সংগ্রহস্থল দ্বারা অনুপ্রাণিত একটি প্রতিনিধিত্বমূলক বিন্যাস এইরকম দেখাচ্ছে:

প্রতিনিধি ফাইল ট্রি: fastapi-project
├── alembic/
├── src
│ ├── auth
│ │ ├── router.py # auth endpoints
│ │ ├── schemas.py # pydantic models
│ │ ├── models.py # DB models
│ │ ├── dependencies.py # auth-specific dependencies
│ │ ├── config.py # local configs
│ │ ├── constants.py # auth error codes / constants
│ │ ├── exceptions.py # auth-specific exceptions
│ │ ├── service.py # business logic
│ │ └── utils.py # helpers
│ ├── aws
│ │ ├── client.py
│ │ ├── schemas.py
│ │ ├── config.py
│ │ ├── constants.py
│ │ ├── exceptions.py
│ │ └── utils.py
│ ├── posts
│ │ ├── router.py
│ │ ├── schemas.py
│ │ ├── models.py
│ │ ├── dependencies.py
│ │ ├── constants.py
│ │ ├── exceptions.py
│ │ ├── service.py
│ │ └── utils.py
│ ├── config.py # global configs
│ ├── models.py # shared DB models
│ ├── exceptions.py # shared exceptions
│ ├── pagination.py # reusable pagination logic
│ ├── database.py # DB connection & session management
│ └── main.py # FastAPI app factory / entry point
├── tests
│ ├── auth
│ ├── aws
│ └── posts
├── templates
│ └── index.html
├── requirements
│ ├── base.txt
│ ├── dev.txt
│ └── prod.txt
├── .env
├── logging.ini
└── alembic.ini

এই পৃথিবীতে, src/ অভ্যন্তরীণ অ্যাপ্লিকেশন ট্রির শীর্ষে রয়েছে। প্রতিটি ডোমেইন, যেমন auth or posts, প্রায় একটি ক্ষুদ্র পরিষেবা হয়ে ওঠে: এটি নিজস্ব রাউটার, স্কিমা, মডেল, ধ্রুবক, ত্রুটির ধরণ এবং ব্যবসায়িক পরিষেবা স্তর বহন করে।

প্রধান সুবিধা হল পরিবর্তনের স্থান: যখন আপনি একটি নতুন বৈশিষ্ট্য যোগ করবেন posts, আপনাকে খুব কমই কোনও সম্পর্কহীন প্যাকেজ স্পর্শ করতে হবে। পরীক্ষাগুলি তাদের বৈশিষ্ট্যগুলির পাশাপাশিও থাকতে পারে (উদাহরণস্বরূপ নীচে tests/posts/), যা উচ্চতর কভারেজকে উৎসাহিত করে।

এই কাঠামোটি বিশেষ করে অনেক ডোমেইন এবং টিমের সাথে একচেটিয়া অ্যাপ্লিকেশনের জন্য উপযুক্ত।, যেখানে আপনি সমান্তরাল কাজ সমর্থন করতে চান এবং মার্জ দ্বন্দ্ব কমাতে চান। এটি ডোমেন-চালিত ডিজাইন ধারণাগুলির সাথেও সুন্দরভাবে কাজ করে যেমন বাউন্ডেড কনটেক্সট এবং এগ্রিগেট।

FastAPI ডোমেইন এবং মডিউল

আপনার FastAPI প্রকল্পের জন্য সঠিক লেআউট নির্বাচন করা

ফাইল-টাইপ এবং বৈশিষ্ট্য-ভিত্তিক কাঠামোর মধ্যে নির্বাচন করা সঠিক বনাম ভুল সম্পর্কে নয়, বরং আপনার স্থাপত্য এবং বৃদ্ধির প্রত্যাশার সাথে মিল রাখার বিষয়ে।। মাত্র কয়েকটি এন্ডপয়েন্ট সহ একটি ক্ষুদ্র অভ্যন্তরীণ টুল, একটি বিস্তৃত ডোমেন লেআউট থেকে খুব বেশি উপকৃত হবে না।

মাইক্রোসার্ভিসেস এবং সংকীর্ণভাবে বিস্তৃত API-এর জন্য, ফাইল-টাইপ লেআউট সাধারণত সহজ হয়। প্রতিটি পরিষেবা প্রায়শই একটি একক দায়িত্বের উপর দৃষ্টি নিবদ্ধ করে (একটি বিলিং API, একটি বিজ্ঞপ্তি প্রেরক, একটি রিপোর্টিং মাইক্রোসার্ভিস), এবং ডেভেলপাররা ইতিমধ্যেই স্বজ্ঞাতভাবে জানেন যে নতুন রুট বা স্কিমা কোথায় স্থাপন করতে হবে।

বৃহত্তর মনোলিথের জন্য, ডোমেন অনুসারে বিভাজন প্রায় সবসময় দীর্ঘমেয়াদে জয়ী হয়। যখন আপনার প্রোফাইল, সাবস্ক্রিপশন, কন্টেন্ট, পেমেন্ট, অ্যানালিটিক্স এবং আরও অনেক কিছুর জন্য মডিউল থাকে, তখন প্রতিটি রাউটারকে একটি একক ডিরেক্টরির অধীনে রাখা বিশৃঙ্খল হয়ে ওঠে। বৈশিষ্ট্য অনুসারে গ্রুপিং সিস্টেমের প্রতিটি অংশকে স্বয়ংসম্পূর্ণ রাখে।

আপনার দলের কাঠামোও বিবেচনা করুন। যদি একটি ছোট দল পুরো কোডবেসের মালিক হয়, তাহলে একটি সহজ লেআউটের মাধ্যমে ধারাবাহিকতা বজায় রাখা সহজ হতে পারে। যদি একাধিক দল এককভাবে কাজ করে এবং প্রতিটি দল একটি ডোমেন এলাকা মালিক হয়, তাহলে একটি বৈশিষ্ট্য-ভিত্তিক কাঠামো তাদের একে অপরের উপর চাপ না দিয়ে দ্রুত এগিয়ে যেতে দেয়।

তুমি যাই বেছে নাও, গাছের সঠিক আকৃতির চেয়ে ধারাবাহিকতা বেশি গুরুত্বপূর্ণ।। প্রকল্পের মাঝখানে লেআউট পরিবর্তন করা কষ্টকর, তাই আগেভাগে কিছু চিন্তাভাবনা করে একটি ছোট অভ্যন্তরীণ স্টাইল গাইড লিখে রাখলে পরে লাভ হবে।

ফাস্টএপিআই নিজেই বোঝা: আপনি কী গঠন করছেন

একটি যুক্তিসঙ্গত কাঠামো ডিজাইন করার জন্য আপনার FastAPI আসলে আপনার জন্য কী করে তার একটি স্পষ্ট মানসিক মডেল প্রয়োজন।। এর মূলে, FastAPI হল একটি ASGI ওয়েব ফ্রেমওয়ার্ক যা টাইপ হিন্ট ব্যবহার করে Python 3.7+ দিয়ে HTTP API তৈরির উপর দৃষ্টি নিবদ্ধ করে।

ডেটা যাচাইকরণ এবং সিরিয়ালাইজেশনের জন্য ফাস্টএপিআই পাইড্যান্টিকের উপর খুব বেশি নির্ভর করে। এটি সহজ "প্রয়োজনীয় বনাম ঐচ্ছিক" ক্ষেত্রগুলির চেয়ে অনেক বেশি কিছু অফার করে; আপনি সরাসরি আপনার মডেলগুলিতে প্রচুর সীমাবদ্ধতা এবং রূপান্তর প্রকাশ করতে পারেন।

যেহেতু OpenAPI স্কিমা সরাসরি আপনার এন্ডপয়েন্ট এবং মডেল থেকে নেওয়া হয়, FastAPI ইন্টারেক্টিভ ডকুমেন্টেশনও তৈরি করে. বাক্সের বাইরে আপনি Swagger UI পাবেন /docs এবং ReDoc এ /redoc, যা ফ্রন্টএন্ড ডেভেলপার বা তৃতীয় পক্ষের ইন্টিগ্রেটরদের সাথে সহযোগিতা করার সময় অমূল্য।

এর আড়ালে, FastAPI Uvicorn এর মতো ASGI সার্ভারের উপরে চলে।। এটি আপনার অ্যাপকে অনেকগুলি সমসাময়িক সংযোগ দক্ষতার সাথে পরিচালনা করতে দেয় এবং অতিরিক্ত অনুষ্ঠান ছাড়াই দীর্ঘস্থায়ী ওয়েবসকেট সংযোগের মতো বৈশিষ্ট্যগুলি সক্ষম করে।

FastAPI অনুরোধ এবং প্রতিক্রিয়া সম্পর্কেও স্পষ্টভাবে বলে।। প্রতিটি এন্ডপয়েন্ট হল একটি নিয়মিত পাইথন ফাংশন (সিঙ্ক বা অ্যাসিঙ্ক) যা দিয়ে সজ্জিত @app.get, @app.post এবং বন্ধুরা, পাথ/কোয়েরি/বডি ডেটা গ্রহণ করে এবং একটি প্রতিক্রিয়া প্রদান করে, সাধারণত একটি ডিক্ট বা পাইড্যান্টিক মডেল।

অ্যাসিঙ্ক বনাম সিঙ্ক: কীভাবে কর্মক্ষমতা কাঠামোর সাথে ছেদ করে

FastAPI প্রথমে একটি অ্যাসিঙ্ক ফ্রেমওয়ার্ক হিসেবে ডিজাইন করা হয়েছে, তবে এটি অ্যাসিঙ্ক এবং সিঙ্ক এন্ডপয়েন্ট উভয়কেই সমর্থন করে।। অভ্যন্তরীণভাবে তারা কীভাবে আচরণ করে তা বোঝা আপনাকে পরিষেবাগুলি কীভাবে ডিজাইন করবে, ক্লায়েন্ট নির্বাচন করবে এবং I/O পরিচালনাকারী মডিউলগুলি কীভাবে গঠন করবে তা জানাবে।

যখন আপনি একটি ঘোষণা করেন async def রুট, FastAPI এটি সরাসরি ইভেন্ট লুপে চালায়। কাঠামোটি ধরে নেয় যে ভিতরে দীর্ঘ সময় ধরে চলমান যেকোনো অপারেশন হবে নন-ব্লকিং ওয়েটেবল, যেমন একটি অ্যাসিঙ্ক ডাটাবেস ড্রাইভার বা একটি HTTP ক্লায়েন্ট যা asyncio.

যদি আপনি ভুলবশত ব্লকিং কল করেন (উদাহরণস্বরূপ time.sleep(), CPU-ভারী লুপ অথবা ধীর লাইব্রেরি যা নেটওয়ার্ক I/O সিঙ্ক্রোনাসভাবে করে) সেই অ্যাসিঙ্ক রুটের ভিতরে, আপনি কার্যকরভাবে ইভেন্ট লুপটি ফ্রিজ করবেন। সেই অপারেশন শেষ না হওয়া পর্যন্ত অন্য কোনও অনুরোধ প্রক্রিয়া করা হবে না, যা অ্যাসিঙ্কের উদ্দেশ্যকে ব্যর্থ করে।

সিঙ্ক রুটগুলি ভিন্নভাবে আচরণ করে: FastAPI একটি থ্রেড পুলে সেগুলি কার্যকর করে। ঐ রুটগুলিতে কাজ ব্লক করলে শুধুমাত্র একটি ওয়ার্কার থ্রেড ধরে থাকে, পুরো ইভেন্ট লুপ নয়, তাই সার্ভার এখনও নতুন অনুরোধ গ্রহণ করতে পারে। যখন আপনাকে সিঙ্ক্রোনাস লাইব্রেরির উপর নির্ভর করতে হয় তখন এইভাবে FastAPI নমনীয় থাকে।

নির্ভরতার ক্ষেত্রেও একই নীতি প্রযোজ্য। সিঙ্ক এবং অ্যাসিঙ্ক উভয় নির্ভরতাই সমর্থিত, তবে সিঙ্ক নির্ভরতাগুলি একটি থ্রেড পুলেও চালানো হয়। ক্ষুদ্র নন-আই/ও সহায়কদের জন্য, অপ্রয়োজনীয় হলে থ্রেডের ওভারহেড এবং সীমাবদ্ধতা এড়াতে প্রায়শই এগুলিকে অ্যাসিঙ্ক চিহ্নিত করা ভাল।

সিপিইউ-আবদ্ধ কাজের চাপ একটি পৃথক গল্প। আপনি প্রক্রিয়ার ভেতরে সিঙ্ক বা অ্যাসিঙ্ক যাই চালান না কেন, GIL (গ্লোবাল ইন্টারপ্রেটার লক) এর অর্থ হল একবারে শুধুমাত্র একটি থ্রেড পাইথন বাইটকোড চালাচ্ছে। ভারী ডেটা প্রক্রিয়াকরণ, চিত্র ট্রান্সকোডিং বা ML ইনফারেন্সের মতো কাজের জন্য, পৃথক প্রক্রিয়া বা বহিরাগত সারিতে কর্মীদের কাছে কাজ অফলোড করার কথা বিবেচনা করুন।

পাইড্যান্টিকের সাহায্যে ডেটা যাচাই এবং আকার দেওয়া

ফাস্টএপিআই-এর বৈধতা এবং সিরিয়ালাইজেশন বৈশিষ্ট্যগুলির পিছনে পাইড্যান্টিক হল ইঞ্জিন।। এটি সহজ "প্রয়োজনীয় বনাম ঐচ্ছিক" ক্ষেত্রগুলির চেয়ে অনেক বেশি কিছু অফার করে; আপনি সরাসরি আপনার মডেলগুলিতে প্রচুর সীমাবদ্ধতা এবং রূপান্তর প্রকাশ করতে পারেন।

সাধারণ ব্যবহারের ক্ষেত্রে স্ট্রিং দৈর্ঘ্য, সংখ্যাসূচক পরিসর, ইমেল ফর্ম্যাট বা জটিল নেস্টেড কাঠামো যাচাই করা অন্তর্ভুক্ত।। মডেলগুলি আপনার ব্যবসায়িক যুক্তিতে আঘাত করার আগে ইনপুটগুলি স্যানিটাইজ করার জন্য এনাম, রেগুলার এক্সপ্রেশন, কাস্টম ভ্যালিডেটর এবং অন্যান্য অনেক সরঞ্জামের উপরও নির্ভর করতে পারে।

একটি শক্তিশালী প্যাটার্ন হল আপনার প্রকল্পের জন্য একটি কাস্টম বেস মডেল সংজ্ঞায়িত করা।। একটি একক বেস ক্লাস থেকে সমস্ত স্কিমা উত্তরাধিকারসূত্রে পেয়ে, আপনি ক্রস-কাটিং আচরণ যেমন ডেটটাইম সিরিয়ালাইজেশন ফর্ম্যাট, ইউটিলিটি পদ্ধতি যা শুধুমাত্র JSON-নিরাপদ মান প্রদান করে, অথবা সাধারণ কনফিগারেশন ফ্ল্যাগগুলিকে মানসম্মত করতে পারেন।

পাইড্যান্টিক বিশুদ্ধ ডেটা যাচাইকরণের জন্য দুর্দান্ত, কিন্তু এটি আপনার ডাটাবেস বা বহিরাগত পরিষেবা সম্পর্কে কিছুই জানে না।। যদি আপনার নিয়মগুলি কোনও প্রশ্নের উপর নির্ভর করে (যেমন একটি ব্যবহারকারী আইডি বিদ্যমান কিনা তা পরীক্ষা করা, অথবা একটি ইমেল অনন্য কিনা), তাহলে একটি সাধারণ সর্বোত্তম অনুশীলন হল সেই বৈধতাগুলিকে পাইড্যান্টিক মডেল ভ্যালিডেটরের পরিবর্তে নির্ভরতাগুলিতে স্থানান্তর করা।

এইভাবে, আপনি স্কিমাগুলিকে ঘোষণামূলক রাখবেন এবং একাধিক এন্ডপয়েন্ট জুড়ে বৈধতা পুনঃব্যবহার করবেন। একটি নির্ভরতা একটি সত্তা আনতে পারে, অ্যাক্সেসের নিয়ম প্রয়োগ করতে পারে এবং ফলাফলটি রুটে ইনজেক্ট করতে পারে, অন্যদিকে FastAPI একই নির্ভরতা একাধিকবার ব্যবহার করা হলে ডুপ্লিকেট কাজ এড়াতে অনুরোধ অনুসারে তার ফলাফল ক্যাশে করে।

পরিষ্কার স্থাপত্যের জন্য নির্ভরতা একটি ভিত্তি হিসেবে

FastAPI-এর নির্ভরতা ইনজেকশন সিস্টেম কেবল প্যারামিটারের জন্য সিনট্যাক্স সুগার নয়; এটি একটি মূল স্থাপত্য সরঞ্জাম।। নির্ভরতার সঠিক ব্যবহার আপনাকে যুক্তি ভাগ করে নিতে, অপরিবর্তনীয়গুলিকে কার্যকর করতে এবং রুটগুলিকে খুব ছোট এবং অভিব্যক্তিপূর্ণ রাখতে সাহায্য করে।

সাধারণ উদাহরণগুলির মধ্যে রয়েছে ডাটাবেস সেশন প্রোভাইডার, কনফিগারেশন লোডার, প্রমাণীকরণ সহায়ক এবং পৃষ্ঠাঙ্কন পার্সার।. সেশনগুলি ম্যানুয়ালি খোলা এবং বন্ধ করার বা সর্বত্র পৃষ্ঠাঙ্কন পরামিতি পুনরাবৃত্তি করার পরিবর্তে, আপনি একবার সেগুলিকে নির্ভরতা হিসাবে ঘোষণা করুন এবং পুনরায় ব্যবহার করুন।

একটি সূক্ষ্ম কিন্তু গুরুত্বপূর্ণ নকশা টিপস হল নির্ভরতাগুলিকে ছোট, সংমিশ্রণযোগ্য ইউনিটে বিভক্ত করা।এক বিশাল দৈত্যের পরিবর্তে get_current_user_with_all_checks ফাংশন ব্যবহার করলে, JWT পার্সিং, ব্যবহারকারী লোড করা, অ্যাকাউন্টটি সক্রিয় কিনা তা যাচাই করা এবং ব্যবহারকারী একটি প্রদত্ত সম্পদের মালিক কিনা তা পরীক্ষা করার জন্য আপনার আলাদা নির্ভরতা থাকতে পারে।

যেহেতু FastAPI একটি একক অনুরোধের মধ্যেই নির্ভরতার ফলাফল ক্যাশে করে, তাই সেগুলি রচনা করা সস্তা।। যদি তিনটি ভিন্ন নির্ভরতা একটি নিম্ন-স্তরের সহায়ক পুনঃব্যবহার করে (উদাহরণস্বরূপ, JWT দাবি বিশ্লেষণ), তাহলে সেই সহায়কটি একাধিকবার উল্লেখ করা হলেও প্রতি অনুরোধে কেবল একবারই চলবে।

রুট ডিজাইন করার সময়, পথের নামকরণ নির্ভরতা পুনঃব্যবহারে সাহায্য করতে পারে অথবা বাধা দিতে পারেউদাহরণস্বরূপ, যদি বেশ কয়েকটি শেষবিন্দু যাচাই করে যে একটি profile_id বিদ্যমান, পাথ প্যারামিটারে ধারাবাহিকভাবে একই নাম ব্যবহার করলে একটি একক নির্ভরতা প্লাগ ইন করা সহজ হয় যা নির্ভর করে profile_id, অনেক বৈচিত্র্য আবিষ্কার করার পরিবর্তে যেমন creator_id যেগুলো একই অর্থ বহন করে।

আপনার কাঠামোতে নিরাপত্তা, প্রমাণীকরণ এবং অনুমোদন

নিরাপত্তা এমন একটি ক্ষেত্র যেখানে একটি স্পষ্ট কাঠামো দ্রুত লাভজনক হয়।। এলোমেলো রুটে সরাসরি প্রমাণীকরণ যুক্তি মিশিয়ে ফেলার ফলে অ্যাক্সেসের নিয়মগুলি অডিট করা কঠিন হয়ে পড়ে এবং দুর্ঘটনাক্রমে ডেটা প্রকাশ করা সহজ হয়ে যায়।

বৈশিষ্ট্য-ভিত্তিক লেআউটের একটি সাধারণ প্যাটার্ন হল একটি auth নিজস্ব রাউটার, স্কিমা, পরিষেবা স্তর এবং ব্যতিক্রম সহ প্যাকেজ. এই মডিউলটি ব্যবহারকারীর নিবন্ধন, লগইন প্রবাহ, টোকেন ইস্যু এবং যাচাইকরণ পরিচালনা করবে এবং নির্ভরতা সংজ্ঞায়িত করতে পারে যেমন get_current_user অন্যান্য মডিউলগুলি আমদানি করে।

সেই প্রমাণীকরণ প্যাকেজের মধ্যে আপনি একাধিক প্রমাণীকরণ প্রক্রিয়া সমর্থন করতে পারেন, যেমন পাসওয়ার্ড এবং বহনকারী টোকেন সহ OAuth2, পরিষেবা-থেকে-পরিষেবা কলের জন্য API কী, অথবা স্টেটলেস API-এর জন্য JWT-ভিত্তিক টোকেন। FastAPI's fastapi.security ইউটিলিটিগুলি আপনাকে OpenAPI-তেও এই প্রবাহগুলি বর্ণনা করতে সাহায্য করে।

প্রমাণীকরণ (ব্যবহারকারী কে) এবং অনুমোদন (তারা কী করতে পারে) আলাদা করা অত্যন্ত গুরুত্বপূর্ণ।। আপনার কাঠামোতে স্পষ্ট করে দেওয়া উচিত যে অনুমতি পরীক্ষাগুলি কোথায় থাকে: উদাহরণস্বরূপ, বিক্ষিপ্ত অ্যাড-হক স্তরের পরিবর্তে একটি ডেডিকেটেড পরিষেবা বা নীতি স্তরে if প্রতিটি রুট জুড়ে বিবৃতি।

যখনই আপনি পাসওয়ার্ড নিয়ে কাজ করবেন, তখন প্রতিষ্ঠিত ক্রিপ্টোগ্রাফিক অনুশীলনগুলি অনুসরণ করুন।। নামী লাইব্রেরির মাধ্যমে bcrypt বা argon2 এর মতো ধীর, লবণাক্ত অ্যালগরিদম সহ হ্যাশ সিক্রেটস, ম্যানুয়াল ক্রিপ্টো এড়িয়ে চলুন এবং টোকেন স্টোরেজ, CSRF সুরক্ষা এবং পরিবহন সুরক্ষা (HTTPS) কে ডিজাইনের প্রথম শ্রেণীর অংশ হিসাবে বিবেচনা করুন।

কার্যকরভাবে FastAPI অ্যাপ্লিকেশন পরীক্ষা করা হচ্ছে

কাঠামো এবং পরীক্ষা একে অপরকে শক্তিশালী করে: একটি পরিষ্কার লেআউট স্বাভাবিকভাবেই আরও পরীক্ষাযোগ্য কোডের দিকে পরিচালিত করে।। FastAPI এর মাধ্যমে আপনি বিভিন্ন স্তরে পরীক্ষা করতে পারবেন, পরিষেবার বিশুদ্ধ ইউনিট পরীক্ষা থেকে শুরু করে HTTP স্তরে সম্পূর্ণ ইন্টিগ্রেশন পরীক্ষা পর্যন্ত।

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

বাস্তব HTTP এন্ডপয়েন্ট ব্যবহার করার জন্য, আপনি Starlette-এর উপর ভিত্তি করে বিল্ট-ইন টেস্ট ক্লায়েন্ট অথবা httpx-এর মতো আধুনিক অ্যাসিঙ্ক ক্লায়েন্ট ব্যবহার করতে পারেন।। ধারণাটি হল আপনার অ্যাপটি আমদানি করা, প্রয়োজন অনুসারে নির্ভরতাগুলিকে ওভাররাইড করা (উদাহরণস্বরূপ, একটি পরীক্ষামূলক ডাটাবেস সেশন ইনজেক্ট করা) এবং কোনও বহিরাগত সার্ভার না চালিয়ে অনুরোধ পাঠানো।

যদি আপনি অ্যাসিঙ্ক ডাটাবেস ড্রাইভার বা অন্যান্য অ্যাসিঙ্ক ইন্টিগ্রেশন নিয়ে কাজ করেন, তাহলে শুরু থেকেই একটি অ্যাসিঙ্ক টেস্ট ক্লায়েন্ট সেট আপ করা মূল্যবান।। পরবর্তীতে সিঙ্ক এবং অ্যাসিঙ্ক টেস্ট স্টাইল মিশ্রিত করার ফলে প্রায়শই বিভ্রান্তিকর ইভেন্ট-লুপ সমস্যা দেখা দেয় যা কেবল একটি পদ্ধতিতে মানসম্মত করার চেয়ে ডিবাগ করা কঠিন।

পরীক্ষায় ডাটাবেসের ব্যবহার আপনার কাঠামোর সাথেও ইন্টারঅ্যাক্ট করেএকটি কেন্দ্রীয় থাকার মাধ্যমে database.py ইঞ্জিন এবং সেশন কারখানাগুলিকে সংজ্ঞায়িত করে এমন মডিউল, পরীক্ষার ডাটাবেসগুলিকে স্পিন করা, লেনদেনে পরীক্ষাগুলি মোড়ানো বা রানের মধ্যে টেবিলগুলি ছাঁটাই করে এমন ফিক্সচার ব্যবহার করা সহজ হয়ে যায়।

স্থানীয় উন্নয়ন থেকে উৎপাদন স্থাপন পর্যন্ত

FastAPI অ্যাপ্লিকেশনগুলি স্থানীয়ভাবে চালানো খুবই সাধারণ, তবে উৎপাদনে আরও কিছুটা পরিকল্পনার প্রয়োজন।। আপনার প্রকল্পের কাঠামো থেকে স্পষ্টভাবে বোঝা উচিত যে অ্যাপটি কীভাবে তৈরি করা হয়, কনফিগারেশন কোথা থেকে আসে এবং লগিং এবং স্বাস্থ্য পরীক্ষা কীভাবে সংযুক্ত করা হয়।

ডেভেলপমেন্টের জন্য, বেশিরভাগ দল অটো-রিলোড সহ ইউভিকর্ন ব্যবহার করে, সাধারণত একটি কমান্ডের মাধ্যমে যেমন uvicorn app.main:app --reload অথবা, নতুন সেটআপে, fastapi dev। এটি দ্রুত প্রতিক্রিয়া লুপ প্রদান করে এবং পুনরাবৃত্তির সময় নিখুঁত।

উৎপাদনে আপনি সাধারণত আরও শক্তিশালী সেটআপ চান: Uvicorn বা Hypercorn কর্মীরা একজন প্রক্রিয়া তত্ত্বাবধায়ক বা WSGI/ASGI র‍্যাপার যেমন Gunicorn দ্বারা পরিচালিত হয়, প্রায়শই একটি বিপরীত প্রক্সির (NGINX বা একটি পরিচালিত লোড ব্যালেন্সার) পিছনে থাকে। লক্ষ্য হল কর্মীদের সংখ্যা, সময়সীমা এবং সুন্দর পুনঃসূচনা নিয়ন্ত্রণ করা, যা দ্বারা জানানো হয় আধুনিক DevOps অনুশীলন.

কনফিগারেশন হার্ড-কোডেড মানগুলির পরিবর্তে পরিবেশগত ভেরিয়েবল দ্বারা চালিত হওয়া উচিত। পাইড্যান্টিকের সেটিংস ম্যানেজমেন্ট বা অনুরূপ টুলগুলি আপনাকে টাইপ করা সেটিংস ক্লাস ঘোষণা করতে এবং স্টার্টআপে লোড করতে সাহায্য করতে পারে, সমস্ত পরিবেশ-নির্দিষ্ট নবগুলিকে এক জায়গায় কেন্দ্রীভূত করে।

আপনার অ্যাপ প্রোডাকশন-রেডি বলার আগে, কয়েকটি প্রয়োজনীয় বিষয় পরীক্ষা করে দেখুন: কাঠামোগত লগিং, মৌলিক মেট্রিক্স, জীবন্ততা এবং প্রস্তুতি প্রোবের জন্য স্বাস্থ্যের শেষ বিন্দু, বুদ্ধিমান শরীরের আকারের সীমা, এবং যদি আপনার API সাধারণ ব্যবহারের জন্য না হয় তবে শুধুমাত্র অ-সর্বজনীন পরিবেশে ডকুমেন্টেশন প্রকাশ করার বিষয়ে একটি স্পষ্ট নীতি।

নামকরণ, ডাটাবেস ডিজাইন এবং মাইগ্রেশন

আপনার মডেল এবং স্কিমা ফাইলগুলিতে আপনি কীভাবে জিনিসগুলির নামকরণ করেন তাও আপনার প্রকল্প কাঠামোর অংশ।। অসঙ্গত নামকরণ হল এমন একটি দ্রুততম উপায় যা ডেভেলপারদের বিভ্রান্ত করার জন্য যা তারা তৈরি করেনি এমন কোডবেসে কাজ করে।

একটি সহজ, কার্যকরী নিয়ম হল ব্যবহার করা lower_case_snake টেবিল এবং কলামের নাম, একক টেবিলের নাম পছন্দ করুন (উদাহরণস্বরূপ post, post_like, user_playlist) এবং সম্পর্কিত টেবিলগুলিকে একটি সাধারণ উপসর্গ দিয়ে গ্রুপ করুন যেমন payment_ or post_.

টেম্পোরাল ফিল্ডের জন্য, প্রত্যয় যেমন _at তারিখের জন্য এবং _date সাধারণ তারিখের জন্য জিনিসগুলি পরিষ্কার রাখুন। এখানে কঠোরতা স্কিমা বা কাঁচা কোয়েরি পড়ার সময় "এটি কি টাইমস্ট্যাম্প নাকি তারিখ?" অনুমান করার খেলাকে বাধা দেয়।

অভিবাসন বিশেষ যত্নের দাবি রাখে; এগুলি নির্ধারক, বিপরীতমুখী এবং বর্ণনামূলক হওয়া উচিত — নিম্নলিখিতগুলি বিবেচনা করুন ডাটাবেস মাইগ্রেশন অনুশীলনঅনেক দল মাইগ্রেশন ফাইলের নামের জন্য একটি প্যাটার্ন গ্রহণ করে যেমন YYYY-MM-DD_slug.py, যা সম্পূর্ণ ডিফ না পড়েই ইতিহাস ট্র্যাক করা এবং কী পরিবর্তন হয়েছে তা বোঝা সহজ করে তোলে।

জটিল রিপোর্টিং বা নেস্টেড রেসপন্সের জন্য, পাইথনে অতিরিক্ত প্রক্রিয়াকরণের পরিবর্তে আপনার ডাটাবেস গ্রহণ করুন।। আধুনিক SQL ইঞ্জিনগুলি CPython-এর তুলনায় অনেক দ্রুত জয়েন, অ্যাগ্রিগেশন এবং JSON বিল্ডিং করতে পারে এবং FastAPI-তে পূর্ব-আকৃতির কাঠামো ফেরত দেওয়া প্রায়ই আপনার প্রতিক্রিয়া মডেলগুলিকে সহজ করে তোলে।

টুলিং, ফর্ম্যাটিং এবং টিম কনভেনশন

স্টাইলের নিয়মগুলি কার্যকর করার জন্য সরঞ্জাম ব্যবহার করলে একটি সুগঠিত প্রকল্প পরিষ্কার রাখা সহজ হয়।। কোড ফরম্যাটার, লিন্টার এবং প্রি-কমিট হুক আপনাকে কোড পর্যালোচনায় হোয়াইটস্পেস নিয়ে তর্ক করার পরিবর্তে ব্যবসায়িক যুক্তির উপর মনোযোগ দিতে সাহায্য করে।

সম্প্রতি, রাফের মতো সরঞ্জামগুলি জনপ্রিয় হয়ে উঠেছে কারণ তারা একই সাথে একাধিক ভূমিকা একত্রিত করে. ফরম্যাটিং, ইম্পোর্ট সর্টিং এবং লিন্টিংয়ের জন্য আলাদা আলাদা ইউটিলিটি ব্যবহার করার পরিবর্তে, আপনি একটি একক দ্রুত টুল চালাতে পারেন যা কোডবেস জুড়ে শত শত নিয়ম প্রয়োগ করে।

একটি সাধারণ স্ক্রিপ্ট বা প্রি-কমিট হুকের মাধ্যমে এই সরঞ্জামগুলি চালানো বাধা কম রাখে। প্রতিটি দলের জন্য একটি বিস্তৃত হুক সেটআপের প্রয়োজন হয় না, তবে কোড লেআউটকে মানসম্মত করে এমন কমপক্ষে একটি কমান্ড থাকা সহজ জয়।

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

একটি FastAPI প্রকল্পের কাঠামো ডিজাইন করা আসলে ভবিষ্যতের কাজকে অনুমানযোগ্য এবং বিরক্তিকর করে তোলার বিষয়ে।: যখন প্রতিটি নতুন এন্ডপয়েন্ট, মডেল বা পরিষেবার একটি স্পষ্ট অবস্থান থাকে, তখন ডেভেলপাররা কোনও চমক ছাড়াই দ্রুত এগিয়ে যেতে পারে, নিরাপত্তা নিরীক্ষা করা সহজ হয় এবং অ্যাপ্লিকেশনটি তার নিজস্ব ওজনের নিচে ভেঙে না পড়ে বাস্তব-বিশ্বের বৃদ্ধি টিকে থাকার অনেক বেশি সম্ভাবনা থাকে।

সম্পর্কিত নিবন্ধ:
সমাধান করা হয়েছে: দ্রুত এপিআই টেমপ্লেট সিনট্যাক্স
সম্পর্কিত পোস্ট: