Web Framework Library — اردو/ویب
This library provides Urdu-keyword wrappers around FastAPI, Flask, WebSocket, Socket.IO, and an async HTTP client. All classes and helpers are imported from the "اردو/ویب" module.
اردو: یہ لائبریری FastAPI، Flask، WebSocket، Socket.IO اور ایک غیر متزامن HTTP کلائنٹ کے گرد اردو کی کلید الفاظ والے ریپر فراہم کرتی ہے۔ تمام کلاسز اور مددگار
"اردو/ویب"ماڈیول سے درآمد کی جاتی ہیں۔
Install dependencies:
pip install fastapi uvicorn flask django python-socketio websockets aiohttp python-jose[cryptography]
Table of Contents
- FastAPI (فاسٹ_اے_پی_آئی)
- Flask (فلاسک)
- Django (ڈجانگو)
- Urdu Jinja2 / Django Templates
- WebSocket (ویب_ساکٹ)
- Socket.IO (ساکٹ_آئی_او)
- HTTP Client (نیٹ / جالی_کلائنٹ)
FastAPI (فاسٹ_اے_پی_آئی) — تیز رفتار ویب فریم ورک
FastAPI is a modern, high-performance web framework for building APIs with automatic documentation.
اردو: FastAPI ایک جدید، اعلی کارکردگی والا ویب فریم ورک ہے جو خودکار دستاویزات کے ساتھ APIs بنانے کے لیے استعمال ہوتا ہے۔ یہ سرور بنانے کا سب سے تیز اور آسان طریقہ ہے۔
Import:
Constructor:
اردو: تعمیر کنندہ (constructor) ایک ترتیب آبجیکٹ قبول کرتا ہے جس میں API کا عنوان، نسخہ اور تفصیل دی جاتی ہے۔
The constructor config object accepts:
| کلید | نوع | پہلے سے | تفصیل |
|---|---|---|---|
عنوان |
string | "اردو API" |
API title shown in docs |
نسخہ |
string | "1.0.0" |
API version |
تفصیل |
string | "" |
API description |
Running the server:
چلائیں accepts: میزبان (host), پورٹ (port), دوبارہ_لوڈ (auto-reload).
Ctrl+C support: All
چلائیں()methods across FastAPI, Flask, Django, WebSocket, Socket.IO, and WebRTC handleKeyboardInterruptgracefully — pressing Ctrl+C in the terminal stops the server cleanly without a traceback.اردو: تمام سرور
چلائیں()میتھڈزKeyboardInterruptکو صاف طریقے سے سنبھالتے ہیں۔ ٹرمینل میں Ctrl+C دبانے سے سرور بغیر کسی خطا کے بند ہو جاتا ہے۔Async script compatibility: If your Urdu script contains any
غیر_متزامن فنکشنorانتظارkeyword, the transpiler wraps the whole script in anasyncioevent loop. Allچلائیں()methods detect this automatically and run the server inside the existing loop instead of starting a new one — so mixing async route handlers withایپ.چلائیں()works without any "event loop already running" error.اردو: اگر آپ کی اسکرپٹ میں
غیر_متزامن فنکشنیاانتظارموجود ہو تو ٹرانسپائلر پوری اسکرپٹ کوasyncioلوپ میں لپیٹ دیتا ہے۔ تمامچلائیں()میتھڈز اسے خودبخود پہچانتے ہیں اور موجودہ لوپ کے اندر سرور چلاتے ہیں — "event loop already running" خطا نہیں آتی۔
Route Decorators — راستہ ڈیکوریٹرز
اردو: راستہ ڈیکوریٹرز مختلف HTTP طریقوں (GET، POST، PUT، DELETE، PATCH) کے اختتامی نقطے بیان کرنے کے لیے استعمال ہوتے ہیں۔
| طریقہ | HTTP | مثال |
|---|---|---|
ایپ.حاصل("/راستہ") |
GET | read data |
ایپ.بھیجیں("/راستہ") |
POST | create resource |
ایپ.تازہ_کریں("/راستہ") |
PUT | replace resource |
ایپ.حذف("/راستہ") |
DELETE | delete resource |
ایپ.پیچ("/راستہ") |
PATCH | partial update |
1. Basic GET and POST Endpoints — بنیادی اختتامی نقطے
اردو: یہ مثال ایک سادہ GET اور POST اختتامی نقطہ دکھاتی ہے۔ GET درخواست ڈیٹا واپس کرتی ہے جبکہ POST درخواست نیا ڈیٹا وصول کرتی ہے۔
درآمد { فاسٹ_اے_پی_آئی } سے "اردو/ویب";
متغیر ایپ = نیا فاسٹ_اے_پی_آئی({ عنوان: "سادہ API", نسخہ: "1.0.0" });
@ایپ.حاصل("/")
فنکشن جڑ() {
واپس { "پیغام": "خوش آمدید", "زبان": "اردو" };
}
@ایپ.بھیجیں("/سلام")
غیر_متزامن فنکشن سلام_کہو(درخواست) {
متغیر باڈی = انتظار درخواست.json();
واپس { "جواب": `السلام، ${باڈی["نام"]}!` };
}
ایپ.چلائیں({ میزبان: "0.0.0.0", پورٹ: 8000 });
Note: Any unannotated parameter in the handler that is not a path parameter is automatically treated as the FastAPI Request object. Call await درخواست.json() to read the JSON body.
اردو: نوٹ: ہینڈلر فنکشن میں جو پیرامیٹر راستہ پیرامیٹر نہیں ہے وہ خودبخود FastAPI کی
Requestدرخواست آبجیکٹ سمجھا جاتا ہے۔ JSON باڈی پڑھنے کے لیےانتظار درخواست.json()استعمال کریں۔
2. Path Parameters — راستہ پیرامیٹرز
Path parameters are declared using {name} syntax in the route string. The parameter name is passed as a function argument.
اردو: راستہ پیرامیٹرز کو راستہ کے اندر
{نام}کی ترکیب سے بیان کیا جاتا ہے اور وہی نام فنکشن کا دلیل بن جاتا ہے۔ مثلاً/اشیاء/{شناخت}میںشناختخودبخود فنکشن کو ملتی ہے۔
درآمد { فاسٹ_اے_پی_آئی } سے "اردو/ویب";
متغیر ایپ = نیا فاسٹ_اے_پی_آئی({ عنوان: "اشیاء API" });
@ایپ.حاصل("/اشیاء/{شناخت}")
فنکشن شے_حاصل(شناخت) {
واپس { "شناخت": شناخت, "نام": "نمونہ شے" };
}
@ایپ.حذف("/صارفین/{صارف_شناخت}")
فنکشن صارف_حذف(صارف_شناخت) {
واپس { "پیغام": `صارف ${صارف_شناخت} حذف کیا گیا` };
}
ایپ.چلائیں({ پورٹ: 8000 });
3. Query Parameters — سوال پیرامیٹرز
Query parameters are defined as function arguments with default values. FastAPI automatically extracts them from the URL query string.
اردو: سوال پیرامیٹرز فنکشن کے دلائل کے طور پر پہلے سے طے شدہ قدروں کے ساتھ بیان کیے جاتے ہیں۔ FastAPI انہیں خودبخود URL کے سوال حصے (
?صفحہ=1&حد=10) سے نکال لیتا ہے۔
درآمد { فاسٹ_اے_پی_آئی } سے "اردو/ویب";
متغیر ایپ = نیا فاسٹ_اے_پی_آئی({ عنوان: "تلاش API" });
// GET /اشیاء?صفحہ=1&حد=10&زمرہ=کتب
@ایپ.حاصل("/اشیاء")
فنکشن اشیاء_حاصل(صفحہ = 1, حد = 10, زمرہ = "سب") {
واپس {
"صفحہ": صفحہ,
"حد": حد,
"زمرہ": زمرہ,
"کل": 100
};
}
ایپ.چلائیں({ پورٹ: 8000 });
To access query parameters from the raw Request object, use the درخواست_سوال helper:
درآمد { فاسٹ_اے_پی_آئی, درخواست_سوال } سے "اردو/ویب";
متغیر ایپ = نیا فاسٹ_اے_پی_آئی({ عنوان: "سوال API" });
@ایپ.حاصل("/تلاش")
فنکشن تلاش(درخواست) {
متغیر کلمہ = درخواست_سوال(درخواست, "q", "");
واپس { "تلاش": کلمہ };
}
ایپ.چلائیں({ پورٹ: 8000 });
4. Request Body (JSON) — درخواست باڈی
Use await درخواست.json() to parse the incoming JSON body inside an async handler.
اردو: آنے والی JSON باڈی کو غیر متزامن ہینڈلر کے اندر
انتظار درخواست.json()سے پڑھیں۔ یہ عام طور پر POST اور PUT درخواستوں میں استعمال ہوتا ہے۔
درآمد { فاسٹ_اے_پی_آئی } سے "اردو/ویب";
متغیر ایپ = نیا فاسٹ_اے_پی_آئی({ عنوان: "صارفین API" });
@ایپ.بھیجیں("/صارفین")
غیر_متزامن فنکشن صارف_بنائیں(درخواست) {
متغیر باڈی = انتظار درخواست.json();
// باڈی ایک dict ہے: { "نام": "احمد", "ای_میل": "ahmed@test.com" }
متغیر نیا_صارف = {
"شناخت": 1,
"نام": باڈی["نام"],
"ای_میل": باڈی["ای_میل"],
"حالت": "فعال"
};
واپس نیا_صارف;
}
@ایپ.تازہ_کریں("/صارفین/{شناخت}")
غیر_متزامن فنکشن صارف_تازہ_کریں(شناخت, درخواست) {
متغیر باڈی = انتظار درخواست.json();
واپس { "شناخت": شناخت, "تازہ_شدہ": باڈی };
}
ایپ.چلائیں({ پورٹ: 8000 });
5. Response with Status Codes — حالت رمز کے ساتھ جواب
Use جیسن_جواب(data, رمز=200) to return a JSON response with a custom HTTP status code.
اردو: مخصوص HTTP حالت رمز کے ساتھ JSON جواب واپس کرنے کے لیے
جیسن_جواب(ڈیٹا، رمز=200)استعمال کریں۔ جواب کلاسز مختلف قسم کے جوابات (JSON، HTML، متن، رجوع) فراہم کرتی ہیں۔
درآمد { فاسٹ_اے_پی_آئی, جیسن_جواب, جالی_خطا } سے "اردو/ویب";
متغیر ایپ = نیا فاسٹ_اے_پی_آئی({ عنوان: "جوابات API" });
@ایپ.بھیجیں("/اشیاء")
غیر_متزامن فنکشن شے_بنائیں(درخواست) {
متغیر باڈی = انتظار درخواست.json();
اگر (!باڈی["نام"]) {
// 422 Unprocessable Entity
واپس نیا جیسن_جواب({ "غلطی": "نام ضروری ہے" }, 422);
}
واپس نیا جیسن_جواب({ "شناخت": 42, "نام": باڈی["نام"] }, 201);
}
@ایپ.حاصل("/اشیاء/{شناخت}")
فنکشن شے_حاصل(شناخت) {
اگر (شناخت == "0") {
// HTTP استثناء پھینکنا
پھینکو نیا جالی_خطا(404, "شے نہیں ملی");
}
واپس نیا جیسن_جواب({ "شناخت": شناخت, "نام": "کتاب" }, 200);
}
ایپ.چلائیں({ پورٹ: 8000 });
Response helper classes:
| کلاس | تفصیل |
|---|---|
نیا جیسن_جواب(data, رمز=200) |
JSON response |
نیا ایچ_ٹی_ایم_ایل_جواب(html, رمز=200) |
HTML response |
نیا سادہ_جواب(text, رمز=200) |
plain text response |
نیا رجوع_جواب(url, رمز=307) |
HTTP redirect |
نیا جالی_خطا(رمز, تفصیل) |
raise HTTP exception |
6. CORS Middleware — درمیانی پرت
Call ایپ.کورس(...) before defining routes to add Cross-Origin Resource Sharing headers.
اردو: راستے بیان کرنے سے پہلے
ایپ.کورس(...)کال کریں تاکہ Cross-Origin Resource Sharing کی سرخیاں شامل ہوں۔ یہ درمیانی پرت براؤزر کو دوسرے ڈومین سے API تک رسائی کی اجازت دیتی ہے۔
درآمد { فاسٹ_اے_پی_آئی } سے "اردو/ویب";
متغیر ایپ = نیا فاسٹ_اے_پی_آئی({ عنوان: "CORS API" });
// تمام اصل سے اجازت دیں
ایپ.کورس(اصل=["*"]);
// یا مخصوص اصل
// ایپ.کورس(اصل=["https://mysite.com", "http://localhost:3000"], اسناد=سچ);
@ایپ.حاصل("/ڈیٹا")
فنکشن ڈیٹا_حاصل() {
واپس { "پیغام": "CORS فعال ہے" };
}
ایپ.چلائیں({ پورٹ: 8000 });
کورس parameters: اصل (list of allowed origins), اسناد (allow_credentials), طریقے (allowed methods), سرخیاں (allowed headers).
7. Router — راؤٹر
Use راؤٹر to group related routes with a shared URL prefix, then register it with ایپ.شامل_کریں(راؤٹر).
اردو:
راؤٹرسے متعلقہ راستوں کو مشترکہ URL سابقے کے ساتھ گروپ کریں، پھرایپ.شامل_کریں(راؤٹر)سے مرکزی ایپ میں شامل کریں۔ یہ بڑی APIs کو منظم رکھنے کا بہترین طریقہ ہے۔
درآمد { فاسٹ_اے_پی_آئی, راؤٹر } سے "اردو/ویب";
// ─── صارفین روٹر ────────────────────────────────────────
متغیر صارف_روٹر = نیا راؤٹر({ سابقہ: "/صارفین", ٹیگ: ["صارفین"] });
@صارف_روٹر.حاصل("/")
فنکشن صارفین_فہرست() {
واپس [
{ "شناخت": 1, "نام": "احمد" },
{ "شناخت": 2, "نام": "فاطمہ" }
];
}
@صارف_روٹر.بھیجیں("/")
غیر_متزامن فنکشن صارف_بنائیں(درخواست) {
متغیر باڈی = انتظار درخواست.json();
واپس { "شناخت": 3, "نام": باڈی["نام"] };
}
@صارف_روٹر.حاصل("/{شناخت}")
فنکشن صارف_ایک(شناخت) {
واپس { "شناخت": شناخت, "نام": "احمد" };
}
@صارف_روٹر.تازہ_کریں("/{شناخت}")
غیر_متزامن فنکشن صارف_تازہ(شناخت, درخواست) {
متغیر باڈی = انتظار درخواست.json();
واپس { "شناخت": شناخت, "تازہ_شدہ": باڈی };
}
@صارف_روٹر.حذف("/{شناخت}")
فنکشن صارف_حذف(شناخت) {
واپس { "پیغام": `صارف ${شناخت} حذف` };
}
// ─── مرکزی ایپ ──────────────────────────────────────────
متغیر ایپ = نیا فاسٹ_اے_پی_آئی({ عنوان: "صارفین API" });
ایپ.شامل_کریں(صارف_روٹر);
@ایپ.حاصل("/")
فنکشن جڑ() {
واپس { "پیغام": "خوش آمدید" };
}
ایپ.چلائیں({ پورٹ: 8000 });
The راؤٹر constructor accepts سابقہ (URL prefix) and ٹیگ (OpenAPI tags list).
8. JWT Authentication — JWT تصدیق
Use جے_ڈبلیو_ٹی.بنائیں() to create tokens and جے_ڈبلیو_ٹی.جانچیں() to verify them. Requires pip install python-jose[cryptography].
اردو: تصدیق کے لیے
جے_ڈبلیو_ٹی.بنائیں()سے ٹوکن بنائیں اورجے_ڈبلیو_ٹی.جانچیں()سے اس کی تصدیق کریں۔ صارف لاگ ان پر ٹوکن جاری کریں اور محفوظ راستوں پرAuthorizationسرخی سے اسے جانچیں۔
درآمد { فاسٹ_اے_پی_آئی, جے_ڈبلیو_ٹی, جیسن_جواب, جالی_خطا, درخواست_سرخی } سے "اردو/ویب";
متغیر ایپ = نیا فاسٹ_اے_پی_آئی({ عنوان: "JWT API" });
متغیر خفیہ_کلید = "میری-خفیہ-کلید-کم-از-کم-32-حروف!";
// ─── لاگ ان — ٹوکن جاری کریں ────────────────────────────
@ایپ.بھیجیں("/لاگ_ان")
غیر_متزامن فنکشن لاگ_ان(درخواست) {
متغیر باڈی = انتظار درخواست.json();
// حقیقی ایپ میں ڈیٹا بیس سے تصدیق کریں
اگر (باڈی["صارف_نام"] == "احمد" && باڈی["پاس_ورڈ"] == "راز123") {
متغیر ٹوکن = جے_ڈبلیو_ٹی.بنائیں(
{ "صارف": باڈی["صارف_نام"], "کردار": "صارف" },
خفیہ_کلید,
{ "میعاد_منٹ": 60 }
);
واپس نیا جیسن_جواب({ "ٹوکن": ٹوکن, "نوع": "Bearer" }, 200);
}
واپس نیا جیسن_جواب({ "غلطی": "صارف نام یا پاس ورڈ غلط" }, 401);
}
// ─── محفوظ راستہ — ٹوکن جانچیں ─────────────────────────
@ایپ.حاصل("/پروفائل")
فنکشن پروفائل(درخواست) {
متغیر authorization = درخواست_سرخی(درخواست, "Authorization", "");
اگر (!authorization || !authorization.startsWith("Bearer ")) {
پھینکو نیا جالی_خطا(401, "ٹوکن ضروری ہے");
}
متغیر ٹوکن = authorization.slice(7);
کوشش {
متغیر معلومات = جے_ڈبلیو_ٹی.جانچیں(ٹوکن, خفیہ_کلید);
واپس { "صارف": معلومات["صارف"], "کردار": معلومات["کردار"] };
} پکڑو (غ) {
پھینکو نیا جالی_خطا(401, "ٹوکن غلط یا میعاد ختم");
}
}
ایپ.چلائیں({ پورٹ: 8000 });
جے_ڈبلیو_ٹی طریقے:
| طریقہ | تفصیل |
|---|---|
جے_ڈبلیو_ٹی.بنائیں(data, خفیہ, opts) |
encode JWT token; opts accepts میعاد_منٹ, طریقہ |
جے_ڈبلیو_ٹی.جانچیں(token, خفیہ) |
decode and verify; raises ValueError on failure |
9. WebSocket Endpoint (inside FastAPI) — ویب ساکٹ اختتامی نقطہ
Declare a WebSocket endpoint on a FastAPI app using ایپ.ویب_ساکٹ("/راستہ").
اردو: FastAPI ایپ پر
ایپ.ویب_ساکٹ("/راستہ")سے ویب ساکٹ اختتامی نقطہ بیان کریں۔ ویب ساکٹ کلائنٹ اور سرور کے درمیان دو طرفہ مستقل کنکشن قائم کرتا ہے۔
درآمد { فاسٹ_اے_پی_آئی } سے "اردو/ویب";
متغیر ایپ = نیا فاسٹ_اے_پی_آئی({ عنوان: "چیٹ API" });
@ایپ.ویب_ساکٹ("/ws/{کلائنٹ_شناخت}")
غیر_متزامن فنکشن ws_endpoint(websocket, کلائنٹ_شناخت) {
انتظار websocket.accept();
لکھو(`کلائنٹ ${کلائنٹ_شناخت} جڑا`);
کوشش {
جبکہ (سچ) {
متغیر پیغام = انتظار websocket.receive_text();
لکھو(`موصول: ${پیغام}`);
انتظار websocket.send_text(`آپ نے کہا: ${پیغام}`);
}
} پکڑو (غ) {
لکھو(`کلائنٹ ${کلائنٹ_شناخت} منقطع`);
}
}
@ایپ.حاصل("/")
فنکشن جڑ() {
واپس { "پیغام": "WebSocket سرور چل رہا ہے" };
}
ایپ.چلائیں({ پورٹ: 8000 });
Connect from a browser with: new WebSocket("ws://localhost:8000/ws/میرا_نام")
10. Lifecycle Events — لائف سائیکل واقعات
Use ایپ.آغاز(fn) and ایپ.اختتام(fn) to run code at server start and stop.
اردو: سرور کے شروع اور بند ہونے پر کوڈ چلانے کے لیے
ایپ.آغازاورایپ.اختتاماستعمال کریں۔ یہ ڈیٹا بیس سے جڑنے، کیش گرم کرنے اور وسائل آزاد کرنے کے لیے مفید ہے۔
درآمد { فاسٹ_اے_پی_آئی } سے "اردو/ویب";
متغیر ایپ = نیا فاسٹ_اے_پی_آئی({ عنوان: "لائف سائیکل API" });
متغیر ڈیٹا_بیس_کنکشن = خالی;
@ایپ.آغاز
غیر_متزامن فنکشن سرور_آغاز() {
لکھو("سرور شروع ہو رہا ہے...");
// ڈیٹا بیس سے جڑیں، کیش گرم کریں وغیرہ
لکھو("تمام سروسز تیار");
}
@ایپ.اختتام
غیر_متزامن فنکشن سرور_اختتام() {
لکھو("سرور بند ہو رہا ہے...");
// کنکشن بند کریں، وسائل آزاد کریں
لکھو("صفائی مکمل");
}
@ایپ.حاصل("/حالت")
فنکشن حالت() {
واپس { "حالت": "چل رہا ہے" };
}
ایپ.چلائیں({ پورٹ: 8000 });
11. Exception Handling — غلطی ہینڈلنگ
Use ایپ.غلطی_ہینڈلر(ExceptionClass) to register a custom handler for a specific exception type.
اردو: مخصوص استثنا قسم کے لیے کسٹم ہینڈلر رجسٹر کرنے کے لیے
ایپ.غلطی_ہینڈلر(ExceptionClass)استعمال کریں۔ یہ غلطیوں کو منظم انداز میں سنبھالنے اور صارف کو مفید پیغام دینے کا طریقہ ہے۔
درآمد { فاسٹ_اے_پی_آئی, جیسن_جواب } سے "اردو/ویب";
متغیر ایپ = نیا فاسٹ_اے_پی_آئی({ عنوان: "غلطی ہینڈلنگ API" });
// ─── کسٹم استثنا کلاس ────────────────────────────────────
// Python کی ValueError کو ہینڈل کریں
@ایپ.غلطی_ہینڈلر(ValueError)
غیر_متزامن فنکشن قدر_غلطی_ہینڈلر(درخواست, خطا) {
واپس نیا جیسن_جواب({
"غلطی": "قدر غلط",
"تفصیل": متن(خطا)
}, 400);
}
// HTTPException ہینڈل کریں
@ایپ.حاصل("/اشیاء/{شناخت}")
غیر_متزامن فنکشن شے_حاصل(شناخت) {
اگر (عدد(شناخت) < 0) {
پھینکو نیا ValueError("شناخت منفی نہیں ہو سکتی");
}
اگر (شناخت == "999") {
پھینکو نیا ValueError("شے موجود نہیں");
}
واپس { "شناخت": شناخت, "نام": "کتاب" };
}
ایپ.چلائیں({ پورٹ: 8000 });
12. Background Tasks — پس منظر کام
Use ایپ.پس_منظر_کام() to run tasks asynchronously after returning a response to the client.
اردو: کلائنٹ کو جواب بھیجنے کے بعد کام غیر متزامن طریقے سے چلانے کے لیے
ایپ.پس_منظر_کام()استعمال کریں۔ جیسے ای میل بھیجنا یا لاگ محفوظ کرنا — جواب فوری ملتا ہے اور کام پردے میں ہوتا رہتا ہے۔
درآمد { فاسٹ_اے_پی_آئی } سے "اردو/ویب";
متغیر ایپ = نیا فاسٹ_اے_پی_آئی({ عنوان: "پس منظر API" });
فنکشن ای_میل_بھیجو(پتہ, مضمون) {
// حقیقی کام: ای میل سرور کو کال کریں
لکھو(`ای میل بھیجی گئی: ${پتہ} — ${مضمون}`);
}
فنکشن لاگ_محفوظ_کرو(عمل, صارف) {
لکھو(`لاگ: ${صارف} نے ${عمل} کیا`);
}
@ایپ.بھیجیں("/رجسٹر")
غیر_متزامن فنکشن رجسٹر(درخواست) {
متغیر باڈی = انتظار درخواست.json();
متغیر کام = ایپ.پس_منظر_کام();
// پس منظر میں ای میل بھیجیں (جواب فوری ملے گا)
کام.add_task(ای_میل_بھیجو, باڈی["ای_میل"], "خوش آمدید!");
کام.add_task(لاگ_محفوظ_کرو, "رجسٹریشن", باڈی["نام"]);
واپس { "پیغام": "رجسٹریشن کامیاب", "صارف": باڈی["نام"] };
}
ایپ.چلائیں({ پورٹ: 8000 });
13. Complete REST API Example (CRUD) — مکمل REST API مثال
A full in-memory CRUD API for a book store:
اردو: یہ مثال ایک کتب خانے کے لیے مکمل CRUD API دکھاتی ہے — تمام کتابیں حاصل کرنا، ایک کتاب دیکھنا، نئی کتاب شامل کرنا، کتاب تازہ کرنا اور کتاب حذف کرنا۔ یہ راؤٹر، CORS اور حالت رمز سب ایک ساتھ استعمال کرتی ہے۔
درآمد { فاسٹ_اے_پی_آئی, راؤٹر, جیسن_جواب, جالی_خطا } سے "اردو/ویب";
متغیر ایپ = نیا فاسٹ_اے_پی_آئی({
عنوان: "کتب خانہ API",
نسخہ: "1.0.0",
تفصیل: "اردو پروگرامنگ زبان میں مکمل CRUD API"
});
ایپ.کورس(اصل=["*"]);
// ─── میموری میں ڈیٹا ────────────────────────────────────
متغیر کتابیں = [
{ "شناخت": 1, "عنوان": "آگ کا دریا", "مصنف": "قرة العین حیدر", "قیمت": 1200 },
{ "شناخت": 2, "عنوان": "اداس نسلیں", "مصنف": "عبداللہ حسین", "قیمت": 980 },
{ "شناخت": 3, "عنوان": "گلستان سعدی", "مصنف": "سعدی شیرازی", "قیمت": 850 }
];
متغیر اگلی_شناخت = 4;
// ─── کتب روٹر ───────────────────────────────────────────
متغیر کتب_روٹر = نیا راؤٹر({ سابقہ: "/کتابیں", ٹیگ: ["کتابیں"] });
// GET /کتابیں/ — تمام کتابیں
@کتب_روٹر.حاصل("/")
فنکشن کتابیں_فہرست() {
واپس کتابیں;
}
// GET /کتابیں/{شناخت} — ایک کتاب
@کتب_روٹر.حاصل("/{شناخت}")
فنکشن کتاب_حاصل(شناخت) {
متغیر کتاب = خالی;
کے_لیے (متغیر ک کا کتابیں) {
اگر (ک["شناخت"] == عدد(شناخت)) {
کتاب = ک;
}
}
اگر (!کتاب) {
پھینکو نیا جالی_خطا(404, `کتاب ${شناخت} نہیں ملی`);
}
واپس کتاب;
}
// POST /کتابیں/ — نئی کتاب شامل
@کتب_روٹر.بھیجیں("/")
غیر_متزامن فنکشن کتاب_شامل(درخواست) {
متغیر باڈی = انتظار درخواست.json();
اگر (!باڈی["عنوان"]) {
پھینکو نیا جالی_خطا(422, "عنوان ضروری ہے");
}
متغیر نئی_کتاب = {
"شناخت": اگلی_شناخت,
"عنوان": باڈی["عنوان"],
"مصنف": باڈی["مصنف"] ?? "نامعلوم",
"قیمت": باڈی["قیمت"] ?? 0
};
کتابیں.push(نئی_کتاب);
اگلی_شناخت = اگلی_شناخت + 1;
واپس نیا جیسن_جواب(نئی_کتاب, 201);
}
// PUT /کتابیں/{شناخت} — کتاب تبدیل
@کتب_روٹر.تازہ_کریں("/{شناخت}")
غیر_متزامن فنکشن کتاب_تازہ(شناخت, درخواست) {
متغیر باڈی = انتظار درخواست.json();
کے_لیے (متغیر ک کا کتابیں) {
اگر (ک["شناخت"] == عدد(شناخت)) {
ک["عنوان"] = باڈی["عنوان"] ?? ک["عنوان"];
ک["مصنف"] = باڈی["مصنف"] ?? ک["مصنف"];
ک["قیمت"] = باڈی["قیمت"] ?? ک["قیمت"];
واپس ک;
}
}
پھینکو نیا جالی_خطا(404, `کتاب ${شناخت} نہیں ملی`);
}
// DELETE /کتابیں/{شناخت} — کتاب حذف
@کتب_روٹر.حذف("/{شناخت}")
فنکشن کتاب_حذف(شناخت) {
متغیر پہلے = لمبائی(کتابیں);
کتابیں = کتابیں.چھانو(فنکشن(ک) { واپس ک["شناخت"] != عدد(شناخت) });
اگر (لمبائی(کتابیں) == پہلے) {
پھینکو نیا جالی_خطا(404, `کتاب ${شناخت} نہیں ملی`);
}
واپس نیا جیسن_جواب({ "پیغام": `کتاب ${شناخت} حذف کی گئی` }, 200);
}
// ─── ایپ میں روٹر شامل کریں ─────────────────────────────
ایپ.شامل_کریں(کتب_روٹر);
@ایپ.حاصل("/")
فنکشن جڑ() {
واپس { "پیغام": "کتب خانہ API میں خوش آمدید", "نسخہ": "1.0.0" };
}
ایپ.چلائیں({ میزبان: "0.0.0.0", پورٹ: 8000 });
Flask (فلاسک) — ہلکا پھلکا ویب فریم ورک
Flask is a lightweight web framework suitable for simple web applications and APIs.
اردو: Flask ایک ہلکا پھلکا ویب فریم ورک ہے جو سادہ ویب ایپلیکیشنز اور APIs کے لیے موزوں ہے۔ یہ FastAPI کے مقابلے میں زیادہ لچک دار ہے لیکن خودکار دستاویزات نہیں بناتا۔
Import:
Constructor:
متغیر ایپ = نیا فلاسک();
// یا تفصیلی ترتیب کے ساتھ
متغیر ایپ = نیا فلاسک({ نام: "میری_ایپ", سانچہ_فولڈر: "templates" });
Running:
Stopping the server — سرور بند کرنا
⚠️ Ctrl+C does not stop a Flask/werkzeug server in threaded mode. Worker threads keep running after the signal. Kill the process from another terminal:
اردو:
Ctrl+CFlask/werkzeug تھریڈڈ موڈ میں سرور کو نہیں روکتا۔ اوپر دی گئی کمانڈ سے پروسیس ختم کریں۔
Flask Route Methods — Flask راستہ طریقے
اردو: Flask میں راستے
ایپ.راستہ()یا مختصر طریقوںایپ.حاصل()اورایپ.بھیجیں()سے بیان کیے جاتے ہیں۔طریقے=[]سے ایک راستے پر متعدد HTTP طریقے بھی لگائے جا سکتے ہیں۔
| طریقہ | HTTP | مثال |
|---|---|---|
ایپ.راستہ(url, طریقے=[...]) |
any | flexible, multiple methods |
ایپ.حاصل(url) |
GET | shorthand |
ایپ.بھیجیں(url) |
POST | shorthand |
ایپ.تازہ_کریں(url) |
PUT | shorthand |
ایپ.حذف(url) |
DELETE | shorthand |
ایپ.پیچ(url) |
PATCH | shorthand |
Flask Helper Functions — Flask مددگار فنکشن
اردو: Flask کے مددگار فنکشن JSON جواب بنانے، درخواست آبجیکٹ حاصل کرنے، رجوع کرنے، سانچہ رینڈر کرنے اور نشست (session) تک رسائی کے لیے استعمال ہوتے ہیں۔
| فنکشن | تفصیل |
|---|---|
فلاسک_جیسن(data, رمز=200) |
Return JSON response |
فلاسک_درخواست() |
Get current request object |
فلاسک_رجوع(url, رمز=302) |
Redirect response |
فلاسک_ربط(endpoint, **kwargs) |
Generate URL with url_for |
فلاسک_سانچہ(template, **ctx) |
Render Jinja2 template |
فلاسک_جواب(content, رمز, mime) |
Custom response |
فلاسک_منسوخ(رمز) |
Abort with HTTP status |
فلاسک_نشست() |
Get session proxy |
فلاسک_عالمی() |
Get g proxy |
Flask Example: Basic Routes
درآمد { فلاسک, فلاسک_جیسن, فلاسک_درخواست, فلاسک_جواب } سے "اردو/ویب";
متغیر ایپ = نیا فلاسک();
// GET — جڑ
@ایپ.حاصل("/")
فنکشن جڑ() {
واپس فلاسک_جیسن({ "پیغام": "خوش آمدید Flask", "زبان": "اردو" });
}
// GET — راستہ پیرامیٹر
@ایپ.راستہ("/سلام/<naam>", ["GET"])
فنکشن سلام(naam) {
واپس فلاسک_جیسن({ "جواب": `السلام، ${naam}!` });
}
// POST — JSON باڈی
@ایپ.بھیجیں("/صارفین")
فنکشن نیا_صارف() {
متغیر req = فلاسک_درخواست();
متغیر باڈی = req.get_json();
واپس فلاسک_جیسن({
"شناخت": 1,
"نام": باڈی["نام"],
"ای_میل": باڈی["ای_میل"]
}, 201);
}
// GET + POST ایک ہی راستے پر
@ایپ.راستہ("/اشیاء", ["GET", "POST"])
فنکشن اشیاء() {
متغیر req = فلاسک_درخواست();
اگر (req.method == "POST") {
متغیر باڈی = req.get_json();
واپس فلاسک_جیسن({ "اضافہ": باڈی["عنوان"] }, 201);
}
واپس فلاسک_جیسن([
{ "شناخت": 1, "عنوان": "آگ کا دریا" },
{ "شناخت": 2, "عنوان": "گلستان سعدی" }
]);
}
// PUT
@ایپ.راستہ("/صارفین/<int:شناخت>", ["PUT"])
فنکشن صارف_تازہ(شناخت) {
واپس فلاسک_جیسن({ "شناخت": شناخت, "حالت": "تازہ" });
}
// DELETE
@ایپ.راستہ("/صارفین/<int:شناخت>", ["DELETE"])
فنکشن صارف_حذف(شناخت) {
واپس فلاسک_جیسن({ "پیغام": `صارف ${شناخت} حذف` });
}
// سادہ متن جواب
@ایپ.حاصل("/متن")
فنکشن متن_جواب() {
واپس فلاسک_جواب("سادہ اردو متن", 200, "text/plain; charset=utf-8");
}
ایپ.چلائیں({ پورٹ: 5000, ڈیبگ: سچ });
Flask: Before/After Request Hooks — درخواست سے پہلے/بعد کے ہکس
اردو:
@ایپ.قبل_درخواستڈیکوریٹر ہر درخواست سے پہلے کوڈ چلاتا ہے (جیسے لاگنگ یا تصدیق)، جبکہ@ایپ.بعد_درخواستہر جواب کے بعد چلتا ہے (جیسے خصوصی سرخیاں شامل کرنا)۔
درآمد { فلاسک, فلاسک_جیسن, فلاسک_درخواست } سے "اردو/ویب";
متغیر ایپ = نیا فلاسک();
// ہر درخواست سے پہلے چلتا ہے
@ایپ.قبل_درخواست
فنکشن لاگ_درخواست() {
متغیر req = فلاسک_درخواست();
لکھو(`درخواست: ${req.method} ${req.path}`);
}
// ہر جواب کے بعد چلتا ہے
@ایپ.بعد_درخواست
فنکشن جواب_تیار_کرو(جواب) {
جواب.headers["X-پروسیس": "اردو-ویب"];
واپس جواب;
}
@ایپ.حاصل("/")
فنکشن جڑ() {
واپس فلاسک_جیسن({ "پیغام": "ہوکس فعال ہیں" });
}
ایپ.چلائیں({ پورٹ: 5000 });
Flask: Error Handlers — Flask غلطی ہینڈلرز
اردو:
@ایپ.غلطی(404)سے مخصوص HTTP غلطی رمز کے لیے کسٹم غلطی صفحات یا جوابات بنائیں۔ یہ صارف کو خودکار سرور پیغاموں کی بجائے موزوں جواب دیتا ہے۔
درآمد { فلاسک, فلاسک_جیسن, فلاسک_منسوخ } سے "اردو/ویب";
متغیر ایپ = نیا فلاسک();
@ایپ.غلطی(404)
فنکشن نہیں_ملا(e) {
واپس فلاسک_جیسن({ "غلطی": "صفحہ نہیں ملا", "رمز": 404 }, 404);
}
@ایپ.غلطی(500)
فنکشن سرور_خطا(e) {
واپس فلاسک_جیسن({ "غلطی": "سرور کی خرابی", "رمز": 500 }, 500);
}
@ایپ.حاصل("/محدود")
فنکشن محدود() {
فلاسک_منسوخ(403); // Forbidden
}
ایپ.چلائیں({ پورٹ: 5000 });
Blueprint (بلیو_پرنٹ) — بلیو پرنٹ
Blueprints group related routes and can be registered on the main app with a URL prefix.
اردو: بلیو پرنٹ متعلقہ راستوں کو گروپ کرتا ہے اور انہیں مرکزی ایپ میں URL سابقے کے ساتھ رجسٹر کیا جا سکتا ہے۔ یہ Flask میں راؤٹر کا متبادل ہے جو کوڈ کو منظم رکھنے میں مدد کرتا ہے۔
درآمد { فلاسک, بلیو_پرنٹ, فلاسک_جیسن, فلاسک_درخواست } سے "اردو/ویب";
// ─── کتابیں بلیو_پرنٹ ────────────────────────────────────
متغیر کتاب_bp = نیا بلیو_پرنٹ("کتابیں", { سابقہ: "/کتابیں" });
@کتاب_bp.حاصل("/")
فنکشن کتابیں_فہرست() {
واپس فلاسک_جیسن([
{ "شناخت": 1, "عنوان": "فیض کا کلام" },
{ "شناخت": 2, "عنوان": "اداس نسلیں" }
]);
}
@کتاب_bp.بھیجیں("/")
فنکشن کتاب_شامل() {
متغیر req = فلاسک_درخواست();
متغیر باڈی = req.get_json();
واپس فلاسک_جیسن({ "شناخت": 3, "عنوان": باڈی["عنوان"] }, 201);
}
@کتاب_bp.راستہ("/<int:شناخت>", ["GET"])
فنکشن کتاب_ایک(شناخت) {
واپس فلاسک_جیسن({ "شناخت": شناخت, "عنوان": "نمونہ" });
}
// بلیو_پرنٹ میں غلطی ہینڈلر
@کتاب_bp.غلطی(404)
فنکشن کتاب_نہیں_ملی(e) {
واپس فلاسک_جیسن({ "غلطی": "کتاب نہیں ملی" }, 404);
}
// ─── مرکزی ایپ ──────────────────────────────────────────
متغیر ایپ = نیا فلاسک();
ایپ.بلیو_پرنٹ_شامل(کتاب_bp);
@ایپ.حاصل("/")
فنکشن جڑ() {
واپس فلاسک_جیسن({ "پیغام": "کتب خانہ" });
}
ایپ.چلائیں({ پورٹ: 5000, ڈیبگ: سچ });
Flask: Complete Web App Example
درآمد { فلاسک, بلیو_پرنٹ,
فلاسک_جیسن, فلاسک_درخواست,
فلاسک_رجوع, فلاسک_منسوخ } سے "اردو/ویب";
متغیر ایپ = نیا فلاسک();
ایپ.ترتیب_دیں("SECRET_KEY", "میری-خفیہ-کلید");
// ─── میموری ڈیٹا ─────────────────────────────────────────
متغیر صارفین = [
{ "شناخت": 1, "نام": "احمد", "ای_میل": "ahmed@urdu.io" },
{ "شناخت": 2, "نام": "فاطمہ", "ای_میل": "fatima@urdu.io" }
];
متغیر اگلی = 3;
// ─── لاگ ─────────────────────────────────────────────────
@ایپ.قبل_درخواست
فنکشن لاگ() {
متغیر req = فلاسک_درخواست();
لکھو(`[${req.method}] ${req.path}`);
}
// ─── CRUD راستے ─────────────────────────────────────────
@ایپ.حاصل("/صارفین")
فنکشن سب_صارفین() {
واپس فلاسک_جیسن(صارفین);
}
@ایپ.حاصل("/صارفین/<int:شناخت>")
فنکشن ایک_صارف(شناخت) {
کے_لیے (متغیر ص کا صارفین) {
اگر (ص["شناخت"] == شناخت) {
واپس فلاسک_جیسن(ص);
}
}
فلاسک_منسوخ(404);
}
@ایپ.بھیجیں("/صارفین")
فنکشن نیا_صارف() {
متغیر req = فلاسک_درخواست();
متغیر باڈی = req.get_json();
اگر (!باڈی || !باڈی["نام"]) {
واپس فلاسک_جیسن({ "غلطی": "نام ضروری ہے" }, 400);
}
متغیر صارف = { "شناخت": اگلی, "نام": باڈی["نام"], "ای_میل": باڈی["ای_میل"] ?? "" };
صارفین.push(صارف);
اگلی = اگلی + 1;
واپس فلاسک_جیسن(صارف, 201);
}
@ایپ.راستہ("/صارفین/<int:شناخت>", ["PUT"])
فنکشن صارف_تازہ(شناخت) {
متغیر req = فلاسک_درخواست();
متغیر باڈی = req.get_json();
کے_لیے (متغیر ص کا صارفین) {
اگر (ص["شناخت"] == شناخت) {
ص["نام"] = باڈی["نام"] ?? ص["نام"];
ص["ای_میل"] = باڈی["ای_میل"] ?? ص["ای_میل"];
واپس فلاسک_جیسن(ص);
}
}
فلاسک_منسوخ(404);
}
@ایپ.راستہ("/صارفین/<int:شناخت>", ["DELETE"])
فنکشن صارف_حذف(شناخت) {
متغیر پہلے = لمبائی(صارفین);
صارفین = صارفین.چھانو(فنکشن(ص) { واپس ص["شناخت"] != شناخت });
اگر (لمبائی(صارفین) == پہلے) {
فلاسک_منسوخ(404);
}
واپس فلاسک_جیسن({ "پیغام": "حذف کامیاب" });
}
// ─── غلطی ہینڈلر ─────────────────────────────────────────
@ایپ.غلطی(404)
فنکشن نہیں_ملا(e) {
واپس فلاسک_جیسن({ "غلطی": "نہیں ملا" }, 404);
}
ایپ.چلائیں({ پورٹ: 5000, ڈیبگ: سچ });
Django (ڈجانگو) — مکمل ویب فریم ورک
Django is a full-featured web framework. The ڈجانگو class sets it up entirely in code — no settings.py, manage.py, or urls.py file required.
اردو: Django ایک مکمل ویب فریم ورک ہے۔
ڈجانگوکلاس اسے مکمل طور پر کوڈ میں ترتیب دیتی ہے — کوئیsettings.py،manage.py، یاurls.pyفائل ضروری نہیں۔
Install:
Import:
Constructor — تعمیر کنندہ
نیا ڈجانگو(...) stores the config. .ترتیب_دیں() calls django.conf.settings.configure(...) and calls django.setup() — it must be called before registering routes.
Config keys:
| کلید | نوع | پہلے سے | تفصیل |
|---|---|---|---|
سانچہ_فولڈر |
list[str] | [] |
Absolute paths to template directories |
ڈیبگ |
bool | جھوٹ |
Enable Django debug mode and error pages |
خفیہ_کلید |
string | dev key | Django SECRET_KEY |
ڈیٹا_بیس |
dict or string | SQLite :memory: |
Database config or SQLite file path |
ایپس |
list[str] | [] |
Additional INSTALLED_APPS entries |
Methods — طریقے
| طریقہ | تفصیل |
|---|---|
ایپ.ترتیب_دیں() |
Configure Django settings and call django.setup() |
ایپ.راستہ(url, view_fn) |
Register a URL → view function mapping |
ایپ.wsgi() |
Return the Django WSGI callable (for use with werkzeug / gunicorn) |
ڈجانگو_سانچہ(request, template, context) — renders a Django template; equivalent to render(request, template, context).
Example — Django app with routes and templates
اردو: مثال — Django ایپ جس میں راستے اور سانچے ہیں، بغیر کسی فائل کے
درآمد { ڈجانگو, ڈجانگو_سانچہ } سے "اردو/ویب";
درآمد * بطور os سے "os";
درآمد { run_simple } سے "werkzeug.serving";
متغیر _بنیاد = os.path.dirname(os.path.abspath(__file__));
متغیر ایپ = نیا ڈجانگو({
"سانچہ_فولڈر": [`${_بنیاد}/templates`],
"ڈیبگ": سچ
});
ایپ.ترتیب_دیں();
// راستہ رجسٹر کریں
@ایپ.راستہ("")
فنکشن گھر(req) {
واپس ڈجانگو_سانچہ(req, "گھر.html", { "عنوان": "اردو Django" });
}
// Django WSGI اور werkzeug سرور
run_simple("0.0.0.0", 8000, ایپ.wsgi(), threaded=سچ);
templates/گھر.html:
<!DOCTYPE html>
<html dir="rtl" lang="ur">
<body>
<h1>{{ عنوان }}</h1>
<p>Django اردو میں خوش آمدید!</p>
</body>
</html>
Architecture note — ساخت نوٹ
The ڈجانگو class wires everything together internally:
- Registers an
UrduFilesystemLoaderinTEMPLATES— this preprocesses Urdu template tags ({% اگر %},{% کے_لیے %}, etc.) before Django's engine sees them. - Builds a
urlpatternslist dynamically asایپ.راستہ()is called. ایپ.wsgi()returnsget_wsgi_application()— usable with werkzeug, gunicorn, or any WSGI server.
اردو:
ڈجانگوکلاس اندرونی طور پرUrduFilesystemLoader(اردو سانچہ ٹیگ پری پروسیسر)،urlpatterns(ہرراستہ()کال کے ساتھ) اورwsgiایپ خود بخود بناتی ہے۔
Django ORM — ڈجانگو ORM
Full Django ORM support is available from اردو/ویب. Define models by extending ڈجانگو_ماڈل, then use the query helpers to create, read, update, and delete rows.
اردو: مکمل Django ORM سپورٹ
اردو/ویبسے دستیاب ہے۔ڈجانگو_ماڈلکو توسیع دے کر ماڈل بنائیں، پھر CRUD کے لیے کوئری مددگار استعمال کریں۔
Import:
درآمد {
ڈجانگو_ماڈل,
متن_خانہ, طویل_متن, عدد_خانہ, اعشاریہ_خانہ,
بولین_خانہ, تاریخ_خانہ, وقت_خانہ,
غیر_ملکی_کلید, ای_میل_خانہ, فائل_خانہ,
سب_حاصل, فلٹر, ایک_حاصل, بنائیں, حذف_کریں
} سے "اردو/ویب";
Model Definition — ماڈل کی تعریف
کلاس مصنوعہ توسیع ڈجانگو_ماڈل {
جامد نام = متن_خانہ(200)
جامد تفصیل = طویل_متن(اجازت=سچ)
جامد قیمت = اعشاریہ_خانہ(10, 2)
جامد دستیاب = بولین_خانہ(ڈیفالٹ=سچ)
جامد ای_میل = ای_میل_خانہ(منفرد=سچ)
}
Rules:
- Always extend ڈجانگو_ماڈل.
- Declare every field with جامد — the transpiler emits class-level attributes, which Django's ModelBase metaclass requires.
- Never use خالی=سچ — خالی is a reserved keyword that transpiles to None, creating invalid Python syntax. Use اجازت=سچ instead.
اردو: ہر فیلڈ
جامدسے شروع ہو، اورخالی=سچکی بجائےاجازت=سچاستعمال کریں۔
Field Types — خانہ کی اقسام
| Urdu | Django equivalent | Parameters |
|---|---|---|
متن_خانہ(n) |
CharField(max_length=n) |
اجازت, ڈیفالٹ, منفرد |
طویل_متن() |
TextField() |
اجازت, ڈیفالٹ |
عدد_خانہ() |
IntegerField() |
اجازت, ڈیفالٹ |
اعشاریہ_خانہ(کل, اعشاریہ) |
DecimalField(max_digits, decimal_places) |
اجازت, ڈیفالٹ |
بولین_خانہ() |
BooleanField() |
ڈیفالٹ |
تاریخ_خانہ() |
DateField() |
خودکار, آج, اجازت |
وقت_خانہ() |
DateTimeField() |
خودکار, آج, اجازت |
ای_میل_خانہ() |
EmailField() |
اجازت, منفرد |
فائل_خانہ(فولڈر) |
FileField(upload_to=...) |
اجازت |
غیر_ملکی_کلید(Model, متعلقہ_نام="...") |
ForeignKey(Model, on_delete=CASCADE, related_name="...") |
اجازت, حذف_پر |
Foreign Key Relations — غیر ملکی کلید
کلاس زمرہ توسیع ڈجانگو_ماڈل {
جامد نام = متن_خانہ(100)
}
کلاس مصنوعہ توسیع ڈجانگو_ماڈل {
جامد نام = متن_خانہ(200)
جامد زمرہ_م = غیر_ملکی_کلید(زمرہ, متعلقہ_نام="مصنوعات")
}
Access the related object:
متغیر م = ایک_حاصل(مصنوعہ, id=1);
لکھو(م.زمرہ_م.نام); // forward: get the category
متغیر ز = ایک_حاصل(زمرہ, id=1);
لکھو(ز.مصنوعات.count()); // reverse: count products in this category
Table Creation — میزیں بنانا
Runs Django's schema editor to CREATE TABLE IF NOT EXISTS for every ڈجانگو_ماڈل subclass. Safe to call on every startup — skips tables that already exist.
Query Helpers — کوئری مددگار
| Helper | Returns | Django equivalent |
|---|---|---|
سب_حاصل(Model) |
QuerySet | Model.objects.all() |
فلٹر(Model, **kwargs) |
QuerySet | Model.objects.filter(**kwargs) |
ایک_حاصل(Model, **kwargs) |
Model instance | Model.objects.get(**kwargs) |
بنائیں(Model, **kwargs) |
Model instance | Model.objects.create(**kwargs) |
حذف_کریں(Model, **kwargs) |
— | Model.objects.get(**kwargs).delete() |
All helpers return full Django ORM objects — every QuerySet method (.count(), .order_by(), .select_related(), field lookups like __icontains, __gte) works normally.
Examples:
// تمام دستیاب مصنوعات
متغیر qs = فلٹر(مصنوعہ, دستیاب=سچ);
// عنوان میں تلاش
متغیر qs = مصنوعہ.objects.filter(نام__icontains="قلم");
// قیمت کے ساتھ کم از کم
متغیر qs = مصنوعہ.objects.filter(قیمت__gte=100).order_by("قیمت");
// شامل کریں
متغیر ز = بنائیں(زمرہ, نام="کتب");
متغیر م = بنائیں(مصنوعہ, نام="اردو لغت", قیمت=350, زمرہ_م=ز);
// تازہ کریں
م.قیمت = 400;
م.save();
// حذف کریں
حذف_کریں(مصنوعہ, id=م.id);
Response Helpers — جواب مددگار
| Helper | Description |
|---|---|
ڈجانگو_سانچہ(req, template, ctx) |
Render a template and return HttpResponse |
ڈجانگو_جواب(body, status=200) |
Plain HttpResponse with optional status code |
ڈجانگو_جیسن(data, status=200) |
JsonResponse — serialises dict or list to JSON |
ڈجانگو_رجوع(url) |
HttpResponseRedirect(url) — redirect to another URL |
Server Startup — سرور شروع کرنا
Starts Django's development WSGI server via werkzeug on the given port. Auto-reload is disabled by default — re-enable with:
اردو:
ایپ.چلائیں()werkzeug کے ذریعے Django WSGI سرور چلاتا ہے۔ بطور ڈیفالٹ آٹو ری لوڈ بند ہے۔
Stopping the server — سرور بند کرنا
⚠️ Ctrl+C does not stop a Django/werkzeug server in threaded mode. The worker threads keep running even after the signal. To force-stop it, kill the process from another terminal:
# Windows (PowerShell or CMD) taskkill /F /IM urdu.exe # or from PowerShell Stop-Process -Name urdu -Forceاردو:
Ctrl+Cwerkzeug تھریڈڈ موڈ میں سرور کو نہیں روکتا — تھریڈ چلتے رہتے ہیں۔ سرور بند کرنے کے لیے اوپر دی گئی کمانڈ استعمال کریں۔
Full Example — مکمل مثال
See Django Kitabistan App for a complete working example with two related ORM models, CRUD views, JSON API, middleware, and Urdu templates.
Urdu Jinja2 / Django Templates — اردو سانچے
Flask's Jinja2 and Django's template engine both support Urdu tag keywords natively. The Urdu runtime preprocesses .html template files before the engine sees them, so all standard Jinja2/Django features work as normal — just written in Urdu.
اردو: Flask کا Jinja2 اور Django کا سانچہ انجن دونوں اردو ٹیگ کلیدی الفاظ کو پیشگی معالجے کے ذریعے سپورٹ کرتے ہیں۔ سانچہ فائلوں میں اردو ٹیگ لکھیں — باقی سب خودکار ہے۔
No extra setup required. نیا فلاسک() automatically wraps the Jinja2 loader.
Tag Keywords — ٹیگ کلیدی الفاظ
| اردو ٹیگ | Jinja2/Django ٹیگ |
|---|---|
{% اگر شرط %} |
{% if condition %} |
{% ورنہ %} |
{% else %} |
{% وگرنہ شرط %} |
{% elif condition %} |
{% اگر_ختم %} |
{% endif %} |
{% کے_لیے x کا فہرست %} |
{% for x in list %} |
{% کے_لیے_ختم %} |
{% endfor %} |
{% توسیع "بنیاد.html" %} |
{% extends "base.html" %} |
{% بلاک نام %} |
{% block name %} |
{% بلاک_ختم %} |
{% endblock %} |
{% شامل "فائل.html" %} |
{% include "file.html" %} |
{% متغیر x = 5 %} |
{% set x = 5 %} |
Expression Keywords — اظہار کلیدی الفاظ
Inside {{ }} expressions and {% %} conditions, these Urdu words are translated:
| اردو | English |
|---|---|
اور |
and |
یا |
or |
نہیں |
not |
کا |
in |
ہے |
is |
سچ |
true |
جھوٹ |
false |
خالی |
none |
لوپ |
loop (Jinja2 loop variable) |
Filters — فلٹر
Urdu filter names are used after | in variable expressions:
| اردو فلٹر | Jinja2 فلٹر |
|---|---|
\|بڑا |
\|upper |
\|چھوٹا |
\|lower |
\|طول |
\|length |
\|محفوظ |
\|safe |
\|عنوانی |
\|title |
\|تراشیں |
\|trim |
\|کاٹیں |
\|truncate |
\|ترتیب |
\|sort |
\|الٹا |
\|reverse |
\|پہلے_سے(val) |
\|default(val) |
\|ملائیں(sep) |
\|join(sep) |
\|نقشہ(attr=...) |
\|map(attribute=...) |
Loop Attributes — لوپ خصوصیات
Inside {% کے_لیے %} blocks, access Jinja2's loop variable with Urdu dot-attributes:
| اردو | Jinja2 |
|---|---|
لوپ.اشاریہ |
loop.index (1-based) |
لوپ.اشاریہ0 |
loop.index0 (0-based) |
لوپ.پہلا |
loop.first |
لوپ.آخری |
loop.last |
لوپ.طول |
loop.length |
Template Inheritance Example — سانچہ وراثت کی مثال
templates/بنیاد.html — base template:
<!DOCTYPE html>
<html dir="rtl" lang="ur">
<head>
<title>{% بلاک عنوان %}میری ایپ{% بلاک_ختم %}</title>
</head>
<body>
<nav>
<a href="/">گھر</a>
</nav>
<main>
{% بلاک مواد %}{% بلاک_ختم %}
</main>
</body>
</html>
templates/گھر.html — child template:
{% توسیع "بنیاد.html" %}
{% بلاک عنوان %}گھر{% بلاک_ختم %}
{% بلاک مواد %}
<h1>خوش آمدید!</h1>
{% اگر اشیاء %}
<p>{{ اشیاء|طول }} اشیاء ملیں:</p>
{% کے_لیے شے کا اشیاء %}
<div>{{ لوپ.اشاریہ }}. {{ شے.نام|عنوانی }}</div>
{% کے_لیے_ختم %}
{% ورنہ %}
<p>کوئی شے نہیں۔</p>
{% اگر_ختم %}
{% بلاک_ختم %}
app.urdu — render the template:
درآمد { فلاسک, فلاسک_سانچہ } سے "اردو/ویب";
متغیر ایپ = نیا فلاسک();
@ایپ.حاصل("/")
فنکشن گھر() {
متغیر فہرست = [
{ "نام": "کتاب" },
{ "نام": "قلم" },
{ "نام": "کاغذ" }
];
واپس فلاسک_سانچہ("گھر.html", اشیاء=فہرست);
}
ایپ.چلائیں(پورٹ=5000);
Mixing Urdu and English — اردو اور انگریزی کا اشتراک
Urdu and standard Jinja2 keywords can be freely mixed in the same template file:
{% توسیع "base.html" %}
{% block title %}صفحہ{% endblock %}
{% بلاک مواد %}
{% if items %}
{% کے_لیے i کا items %}
<p>{{ loop.index }}: {{ i.name|upper }}</p>
{% endfor %}
{% اگر_ختم %}
{% بلاک_ختم %}
WebSocket (ویب_ساکٹ) — ویب ساکٹ سرور
A standalone WebSocket server using the websockets library.
اردو: یہ
websocketsلائبریری پر مبنی ایک الگ ویب ساکٹ سرور ہے۔ ویب ساکٹ کلائنٹ اور سرور کے درمیان مستقل دو طرفہ کنکشن قائم کرتا ہے جو چیٹ، حقیقی وقت کی اطلاعات اور لائیو ڈیٹا کے لیے موزوں ہے۔
Import:
Constructor:
Event handlers:
| طریقہ | تفصیل |
|---|---|
ws.پر_پیغام(fn) |
Called on each incoming message; receives (connection, message) |
ws.پر_جڑنا(fn) |
Called when a client connects; receives (connection) |
ws.پر_منقطع(fn) |
Called when a client disconnects; receives (connection) |
await ws.نشر(message) |
Broadcast message to all connected clients |
ws.چلائیں() |
Start the server (blocking) |
WebSocket Example: Echo Server
درآمد { ویب_ساکٹ } سے "اردو/ویب";
متغیر ws = نیا ویب_ساکٹ({ میزبان: "localhost", پورٹ: 8765 });
@ws.پر_جڑنا
غیر_متزامن فنکشن جڑنا(کلائنٹ) {
لکھو("نیا کلائنٹ جڑا");
انتظار کلائنٹ.send("خوش آمدید!");
}
@ws.پر_پیغام
غیر_متزامن فنکشن پیغام_ملا(کلائنٹ, متن) {
لکھو(`موصول: ${متن}`);
// پیغام واپس بھیجیں (echo)
واپس `آپ نے کہا: ${متن}`;
}
@ws.پر_منقطع
غیر_متزامن فنکشن منقطع(کلائنٹ) {
لکھو("کلائنٹ منقطع ہوا");
}
لکھو("WebSocket سرور شروع ہو رہا ہے...");
ws.چلائیں();
WebSocket Example: Chat Broadcast Server
درآمد { ویب_ساکٹ } سے "اردو/ویب";
متغیر ws = نیا ویب_ساکٹ({ میزبان: "0.0.0.0", پورٹ: 9000 });
متغیر جڑے_کلائنٹ = 0;
@ws.پر_جڑنا
غیر_متزامن فنکشن جڑنا(کلائنٹ) {
جڑے_کلائنٹ = جڑے_کلائنٹ + 1;
لکھو(`نیا کلائنٹ — کل: ${جڑے_کلائنٹ}`);
// تمام کو اطلاع دیں
انتظار ws.نشر(`نیا شخص آیا! (کل: ${جڑے_کلائنٹ})`);
}
@ws.پر_پیغام
غیر_متزامن فنکشن چیٹ(کلائنٹ, پیغام) {
لکھو(`چیٹ: ${پیغام}`);
// سبھی کو نشر کریں (بھیجنے والے کو بھی)
انتظار ws.نشر(پیغام);
واپس خالی; // خود کو دوبارہ نہ بھیجیں
}
@ws.پر_منقطع
غیر_متزامن فنکشن منقطع(کلائنٹ) {
جڑے_کلائنٹ = جڑے_کلائنٹ - 1;
انتظار ws.نشر(`ایک شخص گیا (باقی: ${جڑے_کلائنٹ})`);
}
لکھو("چیٹ سرور: ws://0.0.0.0:9000");
ws.چلائیں();
Note: ws.نشر(message) sends to all clients. To exclude the sender, pass مستثنی=کلائنٹ.
اردو: نوٹ:
ws.نشر(پیغام)تمام جڑے کلائنٹوں کو پیغام بھیجتا ہے۔ بھیجنے والے کو مستثنی کرنے کے لیےمستثنی=کلائنٹپاس کریں۔
Socket.IO (ساکٹ_آئی_او) — حقیقی وقت واقعاتی نظام
A full-featured real-time event system built on Socket.IO with room support, namespaces, and broadcasting. Supports Flask (WSGI), Django (WSGI), and FastAPI (ASGI) — the correct server type is chosen automatically.
اردو: Socket.IO کمروں (rooms)، نام فضاؤں (namespaces) اور نشر (broadcasting) کے ساتھ ایک مکمل حقیقی وقت واقعاتی نظام ہے۔ Flask، Django اور FastAPI تینوں کے ساتھ کام کرتا ہے — فریم ورک خود بخود پہچانا جاتا ہے۔
Import:
درآمد { ساکٹ_آئی_او, فاسٹ_اے_پی_آئی } سے "اردو/ویب";
// یا
درآمد { ساکٹ_آئی_او, فلاسک } سے "اردو/ویب";
// یا
درآمد { ساکٹ_آئی_او, ڈجانگو } سے "اردو/ویب";
Constructor:
// ایپ پاس کریں — WSGI/ASGI خود بخود پہچانا جاتا ہے
متغیر sio = نیا ساکٹ_آئی_او(ایپ=ایپ);
// یا ترتیب dict کے ساتھ
متغیر sio = نیا ساکٹ_آئی_او({ ایپ: ایپ, کورس: ["*"] });
| پیرامیٹر | پہلے سے | تفصیل |
|---|---|---|
ایپ |
None |
Flask / Django / FastAPI wrapper — auto-detects WSGI vs ASGI |
کورس |
"*" |
Allowed CORS origins |
غیر_متزامن |
True |
Overridden automatically when Flask/Django is detected |
Socket.IO Methods
| طریقہ | تفصیل |
|---|---|
@sio.پر("event") |
Register event handler |
@sio.پر_جڑنا() |
Shortcut for "connect" event |
@sio.پر_منقطع() |
Shortcut for "disconnect" event |
sio.بھیجو(event, data, کمرہ=sid) |
Emit to specific client/room |
sio.نشر(event, data) |
Broadcast to all clients |
sio.کمرہ_میں_شامل(sid, room) |
Add client to a room |
sio.کمرہ_چھوڑیں(sid, room) |
Remove client from room |
sio.کمرے(sid) |
List rooms for a client |
sio.wsgi_ایپ(ایپ) |
WSGI wrapper for Flask / Django |
sio.asgi_ایپ(ایپ) |
ASGI wrapper for FastAPI |
sio.چلائیں(ایپ, پورٹ=8000) |
Run server (werkzeug for WSGI, uvicorn for ASGI) |
Note:
بھیجو,نشر,کمرہ_میں_شامل,کمرہ_چھوڑیںareasync— useانتظارin async handlers, orغیر_متزامن_چلائیں()from sync handlers.
Socket.IO با FastAPI (ASGI)
درآمد { ساکٹ_آئی_او, فاسٹ_اے_پی_آئی, جیسن_جواب } سے "اردو/ویب";
درآمد { غیر_متزامن_چلائیں } سے "اردو/دھاگہ";
متغیر ایپ = نیا فاسٹ_اے_پی_آئی({ عنوان: "Socket.IO چیٹ" });
متغیر sio = نیا ساکٹ_آئی_او(ایپ=ایپ);
@sio.پر_جڑنا()
فنکشن جڑنا(sid, environ) {
غیر_متزامن_چلائیں(sio.بھیجو("خوش_آمدید", { "پیغام": "آپ جڑ گئے!" }, کمرہ=sid));
}
@sio.پر("پیغام")
فنکشن پیغام(sid, data) {
غیر_متزامن_چلائیں(sio.نشر("نیا_پیغام", { "از": sid, "متن": data["متن"] }));
}
@sio.پر_منقطع()
فنکشن منقطع(sid) {
لکھو(`منقطع: ${sid}`);
}
@ایپ.حاصل("/")
فنکشن جڑ() {
واپس نیا جیسن_جواب({ "پیغام": "Socket.IO سرور" });
}
sio.چلائیں(ایپ, پورٹ=8000);
FastAPI note: Socket.IO handlers کو sync رکھیں اور
غیر_متزامن_چلائیں()سے emit کریں۔ اگر handlers کوغیر_متزامن فنکشنبنایا تو transpiler پورے module کوasyncio.run()میں لپیٹ دیتا ہے جو uvicorn کے event loop سے ٹکراتا ہے۔
Socket.IO با Flask (WSGI)
درآمد { ساکٹ_آئی_او, فلاسک, فلاسک_جواب } سے "اردو/ویب";
متغیر ایپ = نیا فلاسک();
متغیر sio = نیا ساکٹ_آئی_او(ایپ=ایپ); // خود بخود WSGI threading موڈ
@sio.پر_جڑنا()
فنکشن جڑنا(sid, environ) {
لکھو("جڑا: " + sid);
@sio.پر("پیغام")
فنکشن پیغام(sid, data) {
sio.بھیجو("جواب", { "متن": data["متن"] }, کمرہ=sid);
}
@ایپ.حاصل("/")
فنکشن گھر() {
واپس فلاسک_جواب("Socket.IO Flask سرور");
}
sio.چلائیں(ایپ, پورٹ=5000);
Flask note: Flask کے ساتھ
بھیجواورنشرsync ہیں —انتظاریاغیر_متزامن_چلائیںکی ضرورت نہیں۔
Socket.IO با Django (WSGI)
درآمد { ساکٹ_آئی_او, ڈجانگو } سے "اردو/ویب";
متغیر ایپ = نیا ڈجانگو({ "ڈیبگ": سچ });
ایپ.ترتیب_دیں();
متغیر sio = نیا ساکٹ_آئی_او(ایپ=ایپ); // خود بخود WSGI threading موڈ
@sio.پر_جڑنا()
فنکشن جڑنا(sid, environ) {
لکھو("جڑا: " + sid);
}
@sio.پر("پیغام")
فنکشن پیغام(sid, data) {
sio.نشر("نیا_پیغام", data);
}
sio.چلائیں(ایپ, پورٹ=8000);
Socket.IO: Namespaces
درآمد { ساکٹ_آئی_او, فاسٹ_اے_پی_آئی } سے "اردو/ویب";
درآمد { غیر_متزامن_چلائیں } سے "اردو/دھاگہ";
متغیر ایپ = نیا فاسٹ_اے_پی_آئی({ عنوان: "نام_فضا API" });
متغیر sio = نیا ساکٹ_آئی_او(ایپ=ایپ);
@sio.پر("connect", نام_فضا="/چیٹ")
فنکشن چیٹ_جڑنا(sid, environ) {
لکھو(`چیٹ نام_فضا: ${sid} جڑا`);
}
@sio.پر("پیغام", نام_فضا="/چیٹ")
فنکشن چیٹ_پیغام(sid, data) {
غیر_متزامن_چلائیں(sio.نشر("نیا_پیغام", data, نام_فضا="/چیٹ"));
}
@sio.پر("connect", نام_فضا="/اطلاعات")
فنکشن اطلاعات_جڑنا(sid, environ) {
لکھو(`اطلاعات نام_فضا: ${sid} جڑا`);
}
sio.چلائیں(ایپ, پورٹ=8000);
HTTP Client (نیٹ / جالی_کلائنٹ) — HTTP کلائنٹ
An async HTTP client wrapper built on aiohttp. The singleton نیٹ is available after import, or use جالی_کلائنٹ static methods directly.
اردو: یہ
aiohttpپر مبنی ایک غیر متزامن HTTP کلائنٹ ریپر ہے۔ درآمد کے بعدنیٹسنگلٹن دستیاب ہوتا ہے، یاجالی_کلائنٹکے جامد طریقے براہ راست استعمال کریں۔ تمام طریقےانتظارسے قابل انتظار ہیں۔
Import:
Methods (all await-able):
| طریقہ | تفصیل |
|---|---|
await نیٹ.حاصل(url) |
GET request |
await نیٹ.بھیجیں(url, json=data) |
POST with JSON body |
await نیٹ.تازہ_کریں(url, json=data) |
PUT with JSON body |
await نیٹ.حذف(url) |
DELETE request |
All methods return a dict with: رمز (status code), status (same), data (parsed JSON or text), headers.
HTTP Client Example: API Calls
درآمد { نیٹ } سے "اردو/ویب";
غیر_متزامن فنکشن مرکز() {
متغیر بنیادی = "https://jsonplaceholder.typicode.com";
// ─── GET ────────────────────────────────────────────
لکھو("─── GET ───");
متغیر جواب = انتظار نیٹ.حاصل(`${بنیادی}/posts/1`);
لکھو(`حالت: ${جواب["رمز"]}`);
لکھو(`عنوان: ${جواب["data"]["title"]}`);
// ─── GET فہرست ──────────────────────────────────────
متغیر جواب2 = انتظار نیٹ.حاصل(`${بنیادی}/users`);
لکھو(`کل صارفین: ${لمبائی(جواب2["data"])}`);
// ─── POST ───────────────────────────────────────────
لکھو("\n─── POST ───");
متغیر جواب3 = انتظار نیٹ.بھیجیں(`${بنیادی}/posts`, {
"json": {
"title": "اردو پروگرامنگ",
"body": "یہ پہلی پوسٹ ہے",
"userId": 1
}
});
لکھو(`نئی پوسٹ شناخت: ${جواب3["data"]["id"]}`);
// ─── PUT ─────────────────────────────────────────────
لکھو("\n─── PUT ───");
متغیر جواب4 = انتظار نیٹ.تازہ_کریں(`${بنیادی}/posts/1`, {
"json": {
"id": 1,
"title": "تازہ عنوان",
"body": "تازہ مواد",
"userId": 1
}
});
لکھو(`تازہ عنوان: ${جواب4["data"]["title"]}`);
// ─── DELETE ─────────────────────────────────────────
لکھو("\n─── DELETE ───");
متغیر جواب5 = انتظار نیٹ.حذف(`${بنیادی}/posts/1`);
لکھو(`حذف حالت: ${جواب5["رمز"]}`);
}
انتظار مرکز();
HTTP Client Example: JSON API with Headers
درآمد { جالی_کلائنٹ } سے "اردو/ویب";
غیر_متزامن فنکشن موسم_دیکھو() {
متغیر url = "https://api.open-meteo.com/v1/forecast";
متغیر params = "?latitude=24.86&longitude=67.01¤t_weather=true";
کوشش {
متغیر جواب = انتظار جالی_کلائنٹ.حاصل(`${url}${params}`);
اگر (جواب["رمز"] == 200) {
متغیر ڈیٹا = جواب["data"];
متغیر موسم = ڈیٹا["current_weather"];
لکھو(`کراچی کا موسم:`);
لکھو(` درجہ حرارت: ${موسم["temperature"]} °C`);
لکھو(` ہوا کی رفتار: ${موسم["windspeed"]} km/h`);
}
} پکڑو (غ) {
لکھو(`غلطی: ${غ}`);
}
}
انتظار موسم_دیکھو();
Complete Application Example — مکمل ایپلیکیشن مثال
The following combines FastAPI, JWT authentication, a router, CORS, lifecycle events, and exception handling in a single runnable program:
اردو: درج ذیل مثال FastAPI، JWT تصدیق، راؤٹر، CORS، لائف سائیکل واقعات اور غلطی ہینڈلنگ کو ایک قابل چلانے پروگرام میں یکجا کرتی ہے۔ یہ ایک پیشہ ورانہ API کا نمونہ ہے جو حقیقی منصوبوں کے لیے بنیاد کے طور پر استعمال کی جا سکتی ہے۔
درآمد { فاسٹ_اے_پی_آئی, راؤٹر, جے_ڈبلیو_ٹی,
جیسن_جواب, جالی_خطا,
درخواست_سرخی } سے "اردو/ویب";
// ─── ترتیب ───────────────────────────────────────────────
متغیر ایپ = نیا فاسٹ_اے_پی_آئی({
عنوان: "مکمل اردو API",
نسخہ: "2.0.0",
تفصیل: "جے_ڈبلیو_ٹی، روٹر، CORS"
});
ایپ.کورس(اصل=["*"]);
متغیر خفیہ = "اردو-خفیہ-کلید-32-حرف-ضروری!";
متغیر صارفین = [{ "شناخت": 1, "نام": "احمد", "پاس_ورڈ": "راز" }];
// ─── لائف سائیکل ─────────────────────────────────────────
@ایپ.آغاز
غیر_متزامن فنکشن آغاز() {
لکھو("API سرور شروع");
}
@ایپ.اختتام
غیر_متزامن فنکشن اختتام() {
لکھو("API سرور بند");
}
// ─── تصدیق روٹر ──────────────────────────────────────────
متغیر تصدیق_روٹر = نیا راؤٹر({ سابقہ: "/تصدیق", ٹیگ: ["تصدیق"] });
@تصدیق_روٹر.بھیجیں("/لاگ_ان")
غیر_متزامن فنکشن لاگ_ان(درخواست) {
متغیر باڈی = انتظار درخواست.json();
کے_لیے (متغیر ص کا صارفین) {
اگر (ص["نام"] == باڈی["نام"] && ص["پاس_ورڈ"] == باڈی["پاس_ورڈ"]) {
متغیر ٹوکن = جے_ڈبلیو_ٹی.بنائیں(
{ "شناخت": ص["شناخت"], "نام": ص["نام"] },
خفیہ, { "میعاد_منٹ": 120 }
);
واپس نیا جیسن_جواب({ "ٹوکن": ٹوکن }, 200);
}
}
پھینکو نیا جالی_خطا(401, "اسناد غلط");
}
// ─── محفوظ روٹر ──────────────────────────────────────────
متغیر محفوظ_روٹر = نیا راؤٹر({ سابقہ: "/api", ٹیگ: ["API"] });
@محفوظ_روٹر.حاصل("/پروفائل")
فنکشن پروفائل(درخواست) {
متغیر auth = درخواست_سرخی(درخواست, "authorization", "");
اگر (!auth.startsWith("Bearer ")) {
پھینکو نیا جالی_خطا(401, "ٹوکن ضروری ہے");
}
کوشش {
متغیر معلومات = جے_ڈبلیو_ٹی.جانچیں(auth.slice(7), خفیہ);
واپس { "صارف": معلومات["نام"], "شناخت": معلومات["شناخت"] };
} پکڑو (غ) {
پھینکو نیا جالی_خطا(401, "ٹوکن ناکارہ");
}
}
@محفوظ_روٹر.حاصل("/ڈیٹا")
فنکشن ڈیٹا() {
واپس { "فہرست": ["کتاب", "قلم", "کاغذ"] };
}
// ─── روٹرز شامل کریں ─────────────────────────────────────
ایپ.شامل_کریں(تصدیق_روٹر);
ایپ.شامل_کریں(محفوظ_روٹر);
@ایپ.حاصل("/")
فنکشن جڑ() {
واپس { "پیغام": "اردو API میں خوش آمدید" };
}
ایپ.چلائیں({ میزبان: "0.0.0.0", پورٹ: 8000 });