Skip to content

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

  1. FastAPI (فاسٹ_اے_پی_آئی)
  2. Flask (فلاسک)
  3. Django (ڈجانگو)
  4. Urdu Jinja2 / Django Templates
  5. WebSocket (ویب_ساکٹ)
  6. Socket.IO (ساکٹ_آئی_او)
  7. HTTP Client (نیٹ / جالی_کلائنٹ)

FastAPI (فاسٹ_اے_پی_آئی) — تیز رفتار ویب فریم ورک

FastAPI is a modern, high-performance web framework for building APIs with automatic documentation.

اردو: FastAPI ایک جدید، اعلی کارکردگی والا ویب فریم ورک ہے جو خودکار دستاویزات کے ساتھ APIs بنانے کے لیے استعمال ہوتا ہے۔ یہ سرور بنانے کا سب سے تیز اور آسان طریقہ ہے۔

Import:

درآمد { فاسٹ_اے_پی_آئی } سے "اردو/ویب";

Constructor:

متغیر ایپ = نیا فاسٹ_اے_پی_آئی({ عنوان: "میری API", نسخہ: "1.0.0", تفصیل: "اردو میں بنی API" });

اردو: تعمیر کنندہ (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:

ایپ.چلائیں({ میزبان: "0.0.0.0", پورٹ: 8000 });

چلائیں accepts: میزبان (host), پورٹ (port), دوبارہ_لوڈ (auto-reload).

Ctrl+C support: All چلائیں() methods across FastAPI, Flask, Django, WebSocket, Socket.IO, and WebRTC handle KeyboardInterrupt gracefully — 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 an asyncio event 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:

ایپ.چلائیں({ پورٹ: 5000, ڈیبگ: سچ });

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:

taskkill /F /IM urdu.exe        # CMD / PowerShell
Stop-Process -Name urdu -Force  # PowerShell

اردو: Ctrl+C Flask/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:

pip install django

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 UrduFilesystemLoader in TEMPLATES — this preprocesses Urdu template tags ({% اگر %}, {% کے_لیے %}, etc.) before Django's engine sees them.
  • Builds a urlpatterns list dynamically as ایپ.راستہ() is called.
  • ایپ.wsgi() returns get_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 — سرور شروع کرنا

ایپ.چلائیں(پورٹ=8000)

Starts Django's development WSGI server via werkzeug on the given port. Auto-reload is disabled by default — re-enable with:

ایپ.چلائیں(پورٹ=8000, دوبارہ_لوڈ=سچ)

اردو: ایپ.چلائیں() 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+C werkzeug تھریڈڈ موڈ میں سرور کو نہیں روکتا — تھریڈ چلتے رہتے ہیں۔ سرور بند کرنے کے لیے اوپر دی گئی کمانڈ استعمال کریں۔


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:

متغیر ws = نیا ویب_ساکٹ({ میزبان: "localhost", پورٹ: 8765 });

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: بھیجو, نشر, کمرہ_میں_شامل, کمرہ_چھوڑیں are async — 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&current_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 });