What is Backend Development? — إيه هو الـ Backend؟
العقل المدبر المخفي وراء أي تطبيق ويب
الـ Backend Development هو الجزء اللي بيشتغل على الـ Server Side (ناحية الخادم). المستخدم مش بيشوفه مباشرة، لكنه بيمثل "العقل" (The Brain) الفعلي للتطبيق.
هو اللي بيستقبل الـ Requests، ويشغّل الـ Business Logic، ويتعامل مع الـ Database، ويطبّق الأمان (Security)، ويبعت الـ Responses للمتصفح.
- تخزين وجلب البيانات من الـ Database
- التحقق من صحة المدخلات (Input Validation)
- تطبيق قواعد العمل (Business Rules) زي الـ Login وحساب التقديرات
- توليد المحتوى الديناميكي (Dynamic Content) بناءً على بيانات المستخدم
- التحقق من هوية المستخدمين (Authentication) وإدارة الصلاحيات (Permissions)
- معالجة الأخطاء (Error Handling)
- التواصل مع الخدمات الخارجية (External APIs) زي بوابات الدفع
- توفير البيانات للموقع أو تطبيقات الموبايل
- 🔑 تسجيل الدخول (Login) لأي موقع
- 🔍 البحث عن منتج وعرض النتائج المتاحة فعلاً
- 📋 ملء فورم التقديم وحفظه في الـ Database
- 👤 التحقق إن الـ Username متاح أم لأ
- 📊 عرض لوحة درجاتك أنت بالذات (Personalized Dashboard)
- 💬 حفظ تعليق جديد أو منشور جديد
Frontend vs Backend vs Database
مين بيعمل إيه في منظومة الويب
🖥️ Frontend (Client Side)
- اللي المستخدم بيشوفه ويتعامل معاه
- مبني بـ HTML, CSS, JavaScript
- بيشتغل جوة المتصفح (Browser)
- بيهتم بالشكل والألوان والتفاعل (UX)
⚙️ Backend (Server Side)
- بيعالج الـ Requests القادمة من المستخدم
- مبني بـ Python, JavaScript, Java, PHP…
- بيشتغل على الـ Server
- بيهتم بالـ Logic والأمان والبيانات
🗄️ Database (Data Layer)
- بيحفظ البيانات بشكل دائم (Persistent)
- زي SQLite, MySQL, PostgreSQL
- لا تتكلم مع المستخدم مباشرة أبداً!
- الـ Backend هو الوسيط بينها وبين الـ Frontend
3-Tier Application Architecture — نموذج الطبقات الثلاث
النموذج المعياري لتقسيم تطبيقات الويب
Request–Response Cycle — دورة الطلب والاستجابة
كل حركة على الويب هي سؤال وجواب
| الجزء | الوصف |
|---|---|
| HTTP Method | نوع العملية زي GET أو POST |
| URL Path | المسار المطلوب زي /login |
| Headers | معلومات إضافية (Metadata) عن الـ request |
| Body | البيانات الفعلية — اختياري، موجود في POST/PUT بس |
| الجزء | الوصف |
|---|---|
| Status Code | رقم نتيجة الطلب (200, 404, 500…) |
| Headers | معلومات إضافية زي Content-Type |
| Body | المحتوى الفعلي (HTML, JSON…) |
Static vs Dynamic Websites — الفرق بين الساكن والديناميكي
ليه أصلاً بنحتاج الـ Backend؟
📄 Static Website (موقع ساكن)
- بيعرض نفس المحتوى لكل الناس بدون تغيير
- الصفحات ملفات HTML ثابتة على السيرفر
- مناسب للمواقع التعريفية البسيطة
- عشان تعدل، لازم تعدل ملف الـ HTML يدوياً
- لا يحتاج لـ Database
<h1>Welcome to the department</h1>
<p>Office hours: 9:00 AM - 2:00 PM</p>
<!-- نفس الكلام لكل الناس -->
⚡ Dynamic Website (موقع ديناميكي)
- المحتوى بيتغير بناءً على المستخدم أو البيانات
- الصفحة بتتولد لحظياً بكود الـ Backend
- ضروري للمتاجر، البوابات، الـ Dashboards
- البيانات بتيجي من الـ Database
- يدعم Login وبيانات مخصصة لكل شخص
def dashboard(request):
student_name = 'Mona'
cgpa = 3.8
return render(request, 'dashboard.html', {
'student_name': student_name,
'cgpa': cgpa
})
HTTP Methods & Status Codes — الأوامر ورموز الحالة
لغة الحوار بين الـ Client والـ Server
| Method | الاستخدام |
|---|---|
GET | قراءة بيانات — الـ Body فاضي! البيانات في الـ URL |
POST | إرسال وإنشاء بيانات جديدة — البيانات في الـ Body |
PUT | تعديل كامل لـ resource موجود |
PATCH | تعديل جزئي (Partial Update) — مهم! |
DELETE | حذف resource معين |
| الصفة | GET | POST |
|---|---|---|
| الهدف | قراءة بيانات | إرسال / تغيير بيانات |
| البيانات | في الـ URL (مكشوفة!) | في الـ Body (مخفية) |
| الأمان | غير آمن للبيانات الحساسة | أكثر أماناً |
| Body | لا يحتوي Body | يحتوي على Body |
| Code | المعنى | تذكّره كده |
|---|---|---|
| 200 OK | طلبك اتنفذ بنجاح — User is authorized to see the response | ✅ كله تمام |
| 301 Moved Permanently | الـ Resource اتنقل لعنوان جديد بشكل دائم | 🔀 تحويل دائم |
| 304 Not Modified | استخدم النسخة المحفوظة في الـ Cache — ما اتغيرش | 💾 خد من الكاش |
| 400 Bad Request | الـ Request غلط في التنسيق | ❌ طلبك غلط |
| 401 Unauthorized | محتاج تسجل دخول الأول — Not authenticated | 🔑 اعمل Login |
| 403 Forbidden | Server reachable but user not authorized — وصلت للسيرفر بس ممنوع | 🚫 ممنوع دخول |
| 404 Not Found | الـ Resource مش موجود أصلاً | 🔍 مش هنا |
| 500 Internal Server Error | فيه Bug في كود الـ Backend | 💥 السيرفر اتكسر |
401 = مش authenticated بعد (لازم تعمل Login أول) — مثال: دخلت موقع بدون تسجيل
403 = عملت Login بس مش عندك Permission — مثال: حاولت تدخل Admin Panel وانت طالب عادي
Time-Based Caching — بيعتمد على تاريخ ووقت معين. السيرفر بيقول "الملف ده هيبقى صالح لحد كذا تاريخ".
Expires: Tuesday, 17 Dec 2020 18:30 GMT
Expires ده Response header (مش Request!) ومعناه Time-Based Caching لأنه بيحدد تاريخ انتهاء الصلاحية.Content-Based Caching — بيعتمد على مقارنة محتوى الملف نفسه. لو الملف ما اتغيرش، السيرفر بيرجع 304 Not Modified.
| Header | نوعه | وظيفته |
|---|---|---|
Expires | Response | Time-Based Caching |
If-Modified-Since | Request | Conditional Caching |
Cache-Control | Response | التحكم في الـ Cache |
Authentication (التحقق من الهوية): إنت مين؟ بيتحقق من هوية المستخدم عبر Username/Password.
Authorization (التصريح بالإذن): إنت عندك إذن بإيه؟ بيحدد الـ Permissions بعد الـ Login.
URL Anatomy — تشريح عنوان الويب
فهم مكونات الـ URL خطوة خطوة
| الجزء | الوصف | مثال |
|---|---|---|
| Protocol | البروتوكول المستخدم | http أو https |
| Host / Domain | اسم الموقع على الإنترنت | google.com |
| Port | رقم المنفذ — اختياري، مفصول بنقطتين : عن الـ Host | HTTP=80, HTTPS=443 |
| Path | مسار الصفحة أو الـ Resource على السيرفر | /students/list/ |
| Query String | معاملات إضافية، بتبدأ بـ ? | ?level=2&year=1 |
الـ Cookie هي بيانات صغيرة بيتم تخزينها في متصفح المستخدم. بيستخدمها السيرفر عشان يتذكر المستخدم بين الـ Requests المختلفة (لأن HTTP بطبيعته Stateless).
Why Python & What is a Framework? — ليه Python؟ ويعني إيه Framework؟
اللغة القوية والهيكل الجاهز
- Readable Syntax: الكود قريب من اللغة الإنجليزية الطبيعية — سهل القراءة والفهم
- Indentation: المسافات البادئة جزء من الـ Syntax — بتخلي الكود نظيم غصب عنك
- Large Community: مجتمع ضخم + مكتبات للويب والبيانات والـ AI
- مستخدمة في Google و Instagram و Spotify و YouTube
- سهلة للمبتدئين ومستخدمة في الشركات الكبيرة
الـ Framework هو مجموعة أدوات وقواعد وهيكل جاهز بيساعد المطورين يبنوا تطبيقات أسرع بدون ما يبدأوا من الصفر.
الـ Framework بيتكفل بالـ Routing, Database Access, Security, Templates — وانت تتفرغ للـ Business Logic.
Django Framework & MVT Architecture
إطار العمل الأشمل لتطوير الويب بـ Python
Django هو High-level Python Web Framework بيساعد المطورين يبنوا مواقع آمنة وقابلة للصيانة بشكل سريع. بيتبع مبدأ "Batteries Included" يعني بييجي معاه أدوات كتير جاهزة من الأول.
الأدوات الجاهزة في Django:
- URL Routing — ربط الـ URLs بالـ Views
- ORM — التعامل مع الـ Database بكود Python بدون SQL
- Admin Panel — لوحة إدارة جاهزة فوراً
- Authentication — نظام Login جاهز
- Template Engine — لإنشاء صفحات HTML ديناميكية
Stack الكورس:
| الأداة | الدور |
|---|---|
| 🐍 Python | Programming Language |
| 🏗️ Django | Web Framework |
| 🗄️ SQLite | Default Database |
| 📝 VS Code | Code Editor |
| ⌨️ Terminal | Run Commands |
M — Model
- بيمثل هيكل البيانات
- التعامل مع الـ Database
- زي نموذج الـ Student أو الـ Course
V — View
- الـ Logic والمعالجة
- بيقرر إيه الداتا اللي هترجع
- مثله زي الـ Controller في MVC
T — Template
- واجهة العرض (HTML)
- بتستقبل البيانات من الـ View
- تستخدم
{{ variable }}
WSGI vs ASGI — طريقة معالجة الـ Requests
سؤال ظهر في امتحان 2025
الـ WSGI هو الواجهة التقليدية اللي بيستخدمها Django. بيعالج الـ Requests بشكل Sequential (تتابعي/متزامن) — يعني طلب ورا طلب واحد واحد.
الـ ASGI هو البديل الحديث اللي بيدعم الـ Asynchronous (غير المتزامن) — بيقدر يعالج طلبات كتير في نفس الوقت، مناسب للـ WebSockets والتطبيقات Real-time.
Python Variables & Data Types — المتغيرات وأنواع البيانات
حجر الأساس لكتابة أي كود Python
المتغير هو مكان محجوز في الذاكرة (Memory) لتخزين قيمة معينة وإعادة استخدامها في الكود لاحقاً.
- لا يبدأ برقم:
1name❌ ←name1✅ - لا يحتوي على مسافات:
student name❌ ←student_name✅ - لا يحتوي على علامة الناقص/Dash:
my-var❌ ←my_var✅ (من امتحان 2025!) - حساس لحالة الأحرف (Case-Sensitive):
Ageغيرage
name = 'Ali' # str — نص بين علامات تنصيص
level = 2 # int — رقم صحيح
gpa = 3.8 # float — رقم عشري
is_active = True # bool — منطقي (لازم Capital!)
# معرفة نوع المتغير
print(type(level)) # <class 'int'>
| النوع | الرمز | ملاحظة مهمة |
|---|---|---|
| نص (Text) | str | بين single أو double quotes |
| رقم صحيح | int | بدون نقطة عشرية |
| رقم عشري | float | فيه نقطة عشرية |
| قيمة منطقية | bool | True أو False — الحرف الأول Capital! |
التعليقات بنستخدمها لشرح الكود. الـ Python Interpreter بيتجاهلها تماماً.
# ده تعليق سطر واحد — بيبدأ بعلامة #
name = 'Mohamed'
# مفيش في Python تعليقات بـ // زي JavaScript
# ولا /* */ زي C أو Java للـ single-line
User Input & Type Casting — المدخلات وتحويل الأنواع
كيف نخلي البرنامج يتفاعل مع المستخدم
بنستخدم input() عشان البرنامج يوقف ويستنى المستخدم يكتب حاجة من الكيبورد.
input() بترجع دايماً String — حتى لو المستخدم كتب رقم 20، البرنامج بيشوفه كـ '20' نص! لو حاولت تجمع رقمين هيعملوا Concatenation مش Addition.عشان تتعامل مع الأرقام بصح، لازم تعمل Type Casting:
str()— تحويل لنصint()— تحويل لرقم صحيحfloat()— تحويل لرقم عشريbool()— تحويل لقيمة منطقية
# بدون Casting — هيعمل Concatenation!
age_str = input("Enter age: ")
print(age_str + 1) # ERROR! Can't add str + int
# مع Casting — صح!
age = int(input("Enter age: "))
print(age + 1) # يعمل Addition صح
Control Flow & Loops — الشروط والحلقات
التحكم في مسار البرنامج والتكرار
score = 75
if score >= 85:
print("Excellent") # 4 مسافات إجبارية!
elif score >= 60:
print("Good")
elif score >= 50:
print("Pass")
else:
print("Fail")
IndentationError والكود مش هيشتغل.بنستخدمها لما نكون عارفين عدد المرات مسبقاً أو بنمر على قائمة.
# هيطبع 0, 1, 2, 3, 4
for i in range(5):
print(i)
# المرور على قائمة
students = ['Ali', 'Mona', 'Sara']
for name in students:
print(name)
بتفضل تكرر طول ما الشرط True. لازم تتأكد إن الشرط هيتغير!
count = 0
while count < 3:
print(count)
count += 1 # مهم! لو نسيناه → Infinite Loop
# Output: 0, 1, 2
Lists & Functions — القوائم والدوال
تنظيم البيانات وإعادة استخدام الكود
الـ List هي هيكل بيانات بيحفظ قيم كتير ورا بعض في متغير واحد. بتتكتب بين أقواس مربعة []. العناصر بتبدأ بـ Index رقمه 0.
students = ['Ali', 'Mona', 'Sara']
print(students[0]) # Ali (أول عنصر)
print(students[-1]) # Sara (آخر عنصر)
students.append('Omar') # يضيف في الآخر
last = students.pop() # يشيل الآخر ويرجعه
print(last) # Omar
myNumbers = [1,2,3]x = myNumbers.pop()الـ pop() بتشيل العنصر الأخير وهو 3 — مش 1!
الإجابة: False (لو قالوا "سيُشال 1")
•
list.pop() → يشيل آخر عنصر•
list.pop(0) → يشيل أول عنصر•
set.pop() → عشوائي! (Sets unordered)الدالة هي بلوك من الكود ليه اسم وبنستخدمه أكتر من مرة. بنعرّفها بكلمة def.
def add_numbers(a, b):
return a + b
result = add_numbers(5, 10)
print(result) # 15
# Lambda function (دالة قصيرة)
double = lambda x: x * 2
print(double(7)) # 14
print()→ يعرض على الشاشة بس — القيمة مش بترجع للبرنامجreturn→ يرجع القيمة للكود اللي نادى الدالة عشان يستخدمها
None بشكل افتراضي.Quiz — أسئلة الامتحانات الحقيقية (Lecture 1)
جميع الأسئلة المتعلقة بمحتوى المحاضرة من امتحانات 2021 · 2024 · 2025
Django بيعتمد على نمط MVT — وليس MVC. الـ Model يمثل البيانات، الـ View يمثل الـ Logic (زي الـ Controller في MVC)، والـ Template يمثل واجهة العرض (HTML). السؤال ده ظهر في 2021 و2024.
الهيدر
Expires بيتبعته السيرفر في الـ Response (مش الـ Request). وبما إنه بيحدد تاريخ ووقت معين فده يُسمى Time-Based Caching. السؤال ده أشهر سؤال متكرر في الكورس — ظهر في 2021 و2024!
HTTP يشتغل فوق بروتوكول TCP على الـ Port 80 بشكل افتراضي. الـ TCP بيضمن وصول البيانات بالترتيب وبدون أخطاء. HTTPS بيشتغل على TCP على الـ Port 443.
الـ HTTP Request لازم يحتوي دايماً على: Request Line (Method + URL + Version) + Headers. أما الـ Body فهو اختياري وبيكون موجود في POST/PUT بس — مش في GET. الـ Status Line دي بتبقى في الـ Response مش الـ Request!
الـ POST أقوى وأأمن من الـ GET لأن البيانات في الـ POST بتتبعت في الـ Body مخفية، مش في الـ URL زي الـ GET. لو بعتت Password بـ GET، هيظهر في الـ URL ويتسجل في الـ Browser History!
في الـ URL، الـ Port Number اختياري وبييجي بعد الـ Host مفصول بنقطتين. مثال:
https://example.com:443/path — الـ 443 ده الـ Port. لو مش موجود، المتصفح بيستخدم الـ Default (80 لـ HTTP أو 443 لـ HTTPS).
الـ Cookie بيتم إنشاؤها بواسطة الـ Server وبيتبعتها في الـ Response Header بـ
Set-Cookie. المتصفح (Client) بيحتفظ بيها وبيبعتها مع كل Request جديد للـ Server. دور الـ Client هو الحفظ والإرسال فقط، مش الإنشاء.
الـ Parameters اللي بتتبعت للسيرفر (زي بيانات فورم Login) بتكون في الـ Body بتاع الـ Request. الـ Response Body هو اللي بييجي من السيرفر للـ Client — مش العكس!
الـ HTTP Response لازم يحتوي دايماً على Status Code (زي 200, 404, 500…). الـ Body اختياري — مثلاً الـ 204 No Content بييجي بدون Body. لكن الـ Status Code إجباري في كل Response.
الـ Authorization هو عملية تحديد الـ Permissions — يعني "هل مسموح للمستخدم ده يستخدم الـ Resource ده أم لأ؟". الـ Authentication هي عملية التحقق من هوية المستخدم (مين إنت؟). الفرق: Authentication = من إنت؟ | Authorization = مسموح لك بإيه؟
الـ Status 200 OK معناه "نجح الطلب" — في سياق الـ Authorization، يعني المستخدم عنده إذن وشاف المحتوى بنجاح. السؤال ده ظهر في 2021 و2025!
الـ 403 Forbidden = وصلت للـ Server (السيرفر شغال ومتاح) لكن مش عندك Permission للـ Resource ده. الـ 404 = الـ Resource مش موجود. الـ 500 = فيه مشكلة في السيرفر نفسه.
أيقونة القفل في المتصفح تعني إن الاتصال مشفر بـ HTTPS (Hypertext Transfer Protocol Secure) فوق بروتوكول TLS (Transport Layer Security). ده اتصال آمن ومشفر. لو مفيش قفل = HTTP عادي غير مشفر.
الـ WSGI (بينطق "Whiskey") هو الواجهة التقليدية اللي Django بيستخدمها. بيعالج الـ Requests بشكل Sequential (تتابعي/متزامن) — يعني طلب ورا طلب. عشان تدعم الـ Asynchronous تستخدم ASGI بدلاً منه.
علامة الناقص أو الداش
- غير مسموحة في أسماء المتغيرات في Python لأنها بتُفسَّر كعملية طرح (Subtraction). الصح هو استخدام الـ Underscore: my_var بدلاً من my-var.
الـ
Content-Type header في الـ Response بيحدد نوع الـ Media (MIME type) للمحتوى المُرسَل. مثلاً: text/html للصفحات، application/json للـ APIs، image/png للصور.
myNumbers = [1,2,3] then x = myNumbers.pop() — The removed item will be 1. True or False?دالة
pop() بدون أي argument بتشيل العنصر الأخير من القائمة — وده هو 3 مش 1. لو عايز تشيل أول عنصر اكتب pop(0). الـ Output: x = 3 والقائمة تبقى [1, 2].
الـ PUT مش للـ Partial Updates — ده للتعديل الكامل (Full Update) للـ Resource. اللي بيُستخدم للـ Partial Updates هو الـ PATCH. مثلاً: عايز تغير رقم موبايل شخص بس → استخدم PATCH. عايز تستبدل كل بيانات الشخص → استخدم PUT.
304 اسمه "Not Modified" مش "Not Found"! الـ "Not Found" ده اسم الـ 404. الـ 304 معناه "الـ Resource ما اتغيرش — استخدم النسخة اللي في الـ Cache". البقية كلها صح في تطابقها.
في بروتوكول HTTP، كل ملف بيُعدّ Object مستقل. عندنا: 4 JPEG images + 1 HTML text file = 5 objects. الـ Browser بيعمل HTTP Request لكل Object على حدة عشان يجمع الصفحة كاملة.