البرمجة

معالجة الطلبات بعروض جانغو

معالجة طلبات الويب عبر العروض Views في تطبيق جانغو

مقدمة

يُعد إطار العمل جانغو (Django) أحد أقوى وأشهر أطر العمل مفتوحة المصدر لتطوير تطبيقات الويب باستخدام لغة البرمجة بايثون. يتميز جانغو بالبساطة والمرونة والتنظيم المعماري الذي يتيح للمطورين بناء تطبيقات قابلة للتوسع والصيانة بسهولة. من بين أهم المكونات الأساسية التي يعتمد عليها جانغو في هيكليته المعمارية هو مفهوم “العروض” أو ما يُعرف بـ Views، والذي يُعد بمثابة القلب النابض لأي تطبيق ويب مبني باستخدام هذا الإطار.

العروض في جانغو تمثل الطبقة التي تتعامل مع منطق المعالجة المباشر لطلبات المستخدمين (HTTP requests) وتقوم بإرجاع الاستجابات (HTTP responses) المناسبة، سواء كانت صفحات HTML، بيانات JSON، ملفات، أو أي نوع آخر من المخرجات. وتكمن أهمية العروض في أنها تمثل نقطة الربط بين الطلب الذي يرسله المستخدم ونموذج البيانات (Models) والقوالب (Templates) التي تستخدم في تقديم النتائج.

المفهوم الأساسي للعروض Views

العرض في جانغو هو ببساطة دالة (أو صنف عند استخدام العروض المعتمدة على الأصناف) تأخذ كوسيط كائن طلب (Request object) وتعيد كائن استجابة (Response object). عند تلقي طلب من المستخدم، تقوم جانغو بتحديد العرض المناسب بناءً على نمط URL المُحدد في ملف التوجيه urls.py، ثم تستدعي هذا العرض لمعالجة الطلب وإرجاع النتيجة.

python
from django.http import HttpResponse def my_view(request): return HttpResponse("مرحبًا بك في تطبيقي!")

أنواع العروض في جانغو

هناك نوعان رئيسيان من العروض في جانغو:

  1. العروض المعتمدة على الدوال (Function-Based Views – FBV): وهي عروض تُكتب على شكل دوال عادية في بايثون، وتُستخدم عندما تكون منطق المعالجة بسيطاً ومباشراً.

  2. العروض المعتمدة على الأصناف (Class-Based Views – CBV): وهي عروض تُكتب كأصناف (Classes) توفر آلية أكثر تنظيمًا وقابلية لإعادة الاستخدام من خلال الوراثة والتوريث.

كل نوع من هذه الأنواع له خصائصه واستخداماته، وسنتناول كلًا منها بالتفصيل في الفقرات التالية.


العروض المعتمدة على الدوال (Function-Based Views)

العروض المعتمدة على الدوال هي الشكل الأبسط والأكثر وضوحًا لكتابة العروض في جانغو. وهي ببساطة دالة تستقبل كائن الطلب وتُرجع استجابة. تعتبر هذه الطريقة مثالية للتطبيقات الصغيرة أو عندما يكون منطق المعالجة محدودًا ولا يتطلب الكثير من التعقيد.

مثال:

python
from django.http import HttpResponse def home_view(request): return HttpResponse("

هذه هي الصفحة الرئيسية

"
)

مزايا العروض المعتمدة على الدوال:

  • البساطة وسهولة الفهم للمبتدئين.

  • سرعة التطوير خاصة في التطبيقات الصغيرة أو البروتوتايب.

التحقق من نوع الطلب:

غالبًا ما يُرغب في التحقق من نوع الطلب (GET أو POST) داخل العروض المعتمدة على الدوال. ويمكن تحقيق ذلك بسهولة كما يلي:

python
def form_view(request): if request.method == 'POST': # معالجة البيانات return HttpResponse("تم إرسال النموذج") else: return HttpResponse("
...
"
)

العروض المعتمدة على الأصناف (Class-Based Views)

العروض المعتمدة على الأصناف تمثل نمطًا أكثر تنظيمًا لتطوير العروض، حيث يمكن من خلالها استخدام الوراثة وإعادة استخدام المنطق بين العروض المختلفة. تتيح هذه الطريقة تفكيك مكونات العرض إلى وظائف منفصلة مثل get و post، مما يسهل صيانة الكود وتوسيعه.

مثال على عرض معتمد على صنف:

python
from django.http import HttpResponse from django.views import View class HomeView(View): def get(self, request): return HttpResponse("

مرحبا بك في الصفحة الرئيسية

"
)

ميزات العروض المعتمدة على الأصناف:

  • إمكانية إعادة استخدام الكود عبر الوراثة.

  • فصل أفضل للمهام والمنطق داخل العرض.

  • توفر مجموعة واسعة من العروض الجاهزة (Generic Views).

عروض عامة جاهزة (Generic Class-Based Views):

جانغو يوفر مجموعة من العروض العامة التي تُستخدم بكثرة في التطبيقات مثل:

  • ListView: لعرض قائمة من العناصر.

  • DetailView: لعرض تفاصيل عنصر معين.

  • CreateView: لإنشاء عنصر جديد.

  • UpdateView: لتحديث عنصر موجود.

  • DeleteView: لحذف عنصر.

مثال على استخدام ListView:

python
from django.views.generic import ListView from .models import Article class ArticleListView(ListView): model = Article template_name = 'articles/list.html' context_object_name = 'articles'

كيفية ربط العروض مع ملف urls.py

لكي يتمكن جانغو من ربط العروض بطلبات المستخدمين، يجب تسجيلها في ملف urls.py. لكل عرض، يُربط نمط URL معين.

مثال:

python
from django.urls import path from .views import home_view, HomeView urlpatterns = [ path('', home_view), # عرض معتمد على دالة path('home/', HomeView.as_view()), # عرض معتمد على صنف ]

التعامل مع النماذج Models داخل العروض

في جانغو، يتم تخزين البيانات في قاعدة البيانات من خلال الكائنات النموذجية (Models). يمكن للعروض استدعاء هذه النماذج لاسترجاع البيانات أو تعديلها.

مثال:

python
from .models import Article def article_list(request): articles = Article.objects.all() return render(request, 'articles/list.html', {'articles': articles})

استخدام مكتبة render لعرض القوالب

جانغو يُفضل استخدام مكتبة render بدلاً من HttpResponse لعرض صفحات HTML مع قوالب ديناميكية:

python
from django.shortcuts import render def index_view(request): return render(request, 'index.html', {'title': 'الصفحة الرئيسية'})

استخدام الديكوريتر @login_required

في حال رغبت بتقييد بعض العروض لتكون متاحة فقط للمستخدمين المسجلين الدخول، يمكن استخدام ديكوريتر @login_required كما يلي:

python
from django.contrib.auth.decorators import login_required @login_required def dashboard_view(request): return render(request, 'dashboard.html')

جدول مقارنة بين أنواع العروض في جانغو

المعيار العروض المعتمدة على الدوال (FBV) العروض المعتمدة على الأصناف (CBV)
البساطة سهلة الفهم ومباشرة قد تكون أكثر تعقيدًا للمبتدئين
القابلية لإعادة الاستخدام محدودة عالية من خلال الوراثة
قابلية التنظيم أقل أعلى نظرًا لتقسيم الوظائف
ملاءمة التطبيقات الصغيرة مناسبة جدًا قد تكون مفرطة
دعم العروض الجاهزة (Generic) غير مدعومة مباشرةً مدعومة من خلال الوراثة
إمكانية تخصيص السلوك تتطلب كتابة منطق مخصص سهلة باستخدام الوراثة وتجاوز الدوال

التعامل مع البيانات المرسلة عبر النماذج (Forms)

عند تقديم نموذج عبر المستخدم (POST)، تقوم العروض بمعالجة البيانات والتحقق منها وتخزينها في قاعدة البيانات أو استخدامها في منطق التطبيق. عادةً ما يتم التحقق من صحة البيانات باستخدام كائنات النماذج (Form classes) في جانغو.

مثال:

python
from .forms import ContactForm def contact_view(request): if request.method == 'POST': form = ContactForm(request.POST) if form.is_valid(): # معالجة البيانات return HttpResponse("تم إرسال النموذج بنجاح") else: form = ContactForm() return render(request, 'contact.html', {'form': form})

إرسال واستقبال بيانات JSON

بجانب إرسال صفحات HTML، يمكن للعروض إرسال واستقبال بيانات JSON، مما يُعد أساسًا لبناء واجهات برمجة التطبيقات (APIs).

عرض يُرجع JSON:

python
from django.http import JsonResponse def data_view(request): data = { 'name': 'تطبيق جانغو', 'version': '4.2', } return JsonResponse(data)

التعامل مع الأخطاء داخل العروض

ينبغي على المطورين التأكد من معالجة الأخطاء بطريقة مناسبة عند تنفيذ العروض، خاصة عند التعامل مع قواعد البيانات أو مدخلات المستخدم. يمكن استخدام معالجة الاستثناءات:

python
from django.shortcuts import get_object_or_404 from .models import Article def article_detail(request, article_id): article = get_object_or_404(Article, id=article_id) return render(request, 'articles/detail.html', {'article': article})

التحقق من الأذونات والصلاحيات داخل العروض

يمكن التحقق من صلاحيات المستخدم داخل العروض للتأكد من قدرته على تنفيذ العمليات المطلوبة، سواء عبر ديكوريتر أو منطق مخصص:

python
from django.core.exceptions import PermissionDenied def admin_view(request): if not request.user.is_staff: raise PermissionDenied return HttpResponse("أهلاً بك في لوحة التحكم")

الخاتمة

العروض (Views) في جانغو تُعد من أهم الركائز التي يقوم عليها أي تطبيق ويب، إذ تُشكل جسر الربط بين الطلبات الواردة من المستخدمين والنماذج والقوالب والبيانات. توفر جانغو مرونة كبيرة من خلال دعم العروض المعتمدة على الدوال والأصناف، ما يتيح للمطورين اختيار الأسلوب الأنسب لتطبيقاتهم حسب متطلبات المشروع. كما أن الفهم العميق لطريقة معالجة العروض لطلبات الويب يمكن أن يُحسن الأداء ويُسهم في بناء تطبيقات قوية وقابلة للتوسع وسهلة الصيانة.

المصادر