معالجة طلبات الويب عبر العروض Views في تطبيق جانغو
مقدمة
يُعد إطار العمل جانغو (Django) أحد أقوى وأشهر أطر العمل مفتوحة المصدر لتطوير تطبيقات الويب باستخدام لغة البرمجة بايثون. يتميز جانغو بالبساطة والمرونة والتنظيم المعماري الذي يتيح للمطورين بناء تطبيقات قابلة للتوسع والصيانة بسهولة. من بين أهم المكونات الأساسية التي يعتمد عليها جانغو في هيكليته المعمارية هو مفهوم “العروض” أو ما يُعرف بـ Views، والذي يُعد بمثابة القلب النابض لأي تطبيق ويب مبني باستخدام هذا الإطار.
العروض في جانغو تمثل الطبقة التي تتعامل مع منطق المعالجة المباشر لطلبات المستخدمين (HTTP requests) وتقوم بإرجاع الاستجابات (HTTP responses) المناسبة، سواء كانت صفحات HTML، بيانات JSON، ملفات، أو أي نوع آخر من المخرجات. وتكمن أهمية العروض في أنها تمثل نقطة الربط بين الطلب الذي يرسله المستخدم ونموذج البيانات (Models) والقوالب (Templates) التي تستخدم في تقديم النتائج.
المفهوم الأساسي للعروض Views
العرض في جانغو هو ببساطة دالة (أو صنف عند استخدام العروض المعتمدة على الأصناف) تأخذ كوسيط كائن طلب (Request object) وتعيد كائن استجابة (Response object). عند تلقي طلب من المستخدم، تقوم جانغو بتحديد العرض المناسب بناءً على نمط URL المُحدد في ملف التوجيه urls.py، ثم تستدعي هذا العرض لمعالجة الطلب وإرجاع النتيجة.
pythonfrom django.http import HttpResponse
def my_view(request):
return HttpResponse("مرحبًا بك في تطبيقي!")
أنواع العروض في جانغو
هناك نوعان رئيسيان من العروض في جانغو:
-
العروض المعتمدة على الدوال (Function-Based Views – FBV): وهي عروض تُكتب على شكل دوال عادية في بايثون، وتُستخدم عندما تكون منطق المعالجة بسيطاً ومباشراً.
-
العروض المعتمدة على الأصناف (Class-Based Views – CBV): وهي عروض تُكتب كأصناف (Classes) توفر آلية أكثر تنظيمًا وقابلية لإعادة الاستخدام من خلال الوراثة والتوريث.
كل نوع من هذه الأنواع له خصائصه واستخداماته، وسنتناول كلًا منها بالتفصيل في الفقرات التالية.
العروض المعتمدة على الدوال (Function-Based Views)
العروض المعتمدة على الدوال هي الشكل الأبسط والأكثر وضوحًا لكتابة العروض في جانغو. وهي ببساطة دالة تستقبل كائن الطلب وتُرجع استجابة. تعتبر هذه الطريقة مثالية للتطبيقات الصغيرة أو عندما يكون منطق المعالجة محدودًا ولا يتطلب الكثير من التعقيد.
مثال:
pythonfrom django.http import HttpResponse
def home_view(request):
return HttpResponse("هذه هي الصفحة الرئيسية
")
مزايا العروض المعتمدة على الدوال:
-
البساطة وسهولة الفهم للمبتدئين.
-
سرعة التطوير خاصة في التطبيقات الصغيرة أو البروتوتايب.
التحقق من نوع الطلب:
غالبًا ما يُرغب في التحقق من نوع الطلب (GET أو POST) داخل العروض المعتمدة على الدوال. ويمكن تحقيق ذلك بسهولة كما يلي:
pythondef form_view(request):
if request.method == 'POST':
# معالجة البيانات
return HttpResponse("تم إرسال النموذج")
else:
return HttpResponse("")
العروض المعتمدة على الأصناف (Class-Based Views)
العروض المعتمدة على الأصناف تمثل نمطًا أكثر تنظيمًا لتطوير العروض، حيث يمكن من خلالها استخدام الوراثة وإعادة استخدام المنطق بين العروض المختلفة. تتيح هذه الطريقة تفكيك مكونات العرض إلى وظائف منفصلة مثل get و post، مما يسهل صيانة الكود وتوسيعه.
مثال على عرض معتمد على صنف:
pythonfrom 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:
pythonfrom 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 معين.
مثال:
pythonfrom django.urls import path
from .views import home_view, HomeView
urlpatterns = [
path('', home_view), # عرض معتمد على دالة
path('home/', HomeView.as_view()), # عرض معتمد على صنف
]
التعامل مع النماذج Models داخل العروض
في جانغو، يتم تخزين البيانات في قاعدة البيانات من خلال الكائنات النموذجية (Models). يمكن للعروض استدعاء هذه النماذج لاسترجاع البيانات أو تعديلها.
مثال:
pythonfrom .models import Article
def article_list(request):
articles = Article.objects.all()
return render(request, 'articles/list.html', {'articles': articles})
استخدام مكتبة render لعرض القوالب
جانغو يُفضل استخدام مكتبة render بدلاً من HttpResponse لعرض صفحات HTML مع قوالب ديناميكية:
pythonfrom django.shortcuts import render
def index_view(request):
return render(request, 'index.html', {'title': 'الصفحة الرئيسية'})
استخدام الديكوريتر @login_required
في حال رغبت بتقييد بعض العروض لتكون متاحة فقط للمستخدمين المسجلين الدخول، يمكن استخدام ديكوريتر @login_required كما يلي:
pythonfrom 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) في جانغو.
مثال:
pythonfrom .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:
pythonfrom django.http import JsonResponse
def data_view(request):
data = {
'name': 'تطبيق جانغو',
'version': '4.2',
}
return JsonResponse(data)
التعامل مع الأخطاء داخل العروض
ينبغي على المطورين التأكد من معالجة الأخطاء بطريقة مناسبة عند تنفيذ العروض، خاصة عند التعامل مع قواعد البيانات أو مدخلات المستخدم. يمكن استخدام معالجة الاستثناءات:
pythonfrom 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})
التحقق من الأذونات والصلاحيات داخل العروض
يمكن التحقق من صلاحيات المستخدم داخل العروض للتأكد من قدرته على تنفيذ العمليات المطلوبة، سواء عبر ديكوريتر أو منطق مخصص:
pythonfrom django.core.exceptions import PermissionDenied
def admin_view(request):
if not request.user.is_staff:
raise PermissionDenied
return HttpResponse("أهلاً بك في لوحة التحكم")
الخاتمة
العروض (Views) في جانغو تُعد من أهم الركائز التي يقوم عليها أي تطبيق ويب، إذ تُشكل جسر الربط بين الطلبات الواردة من المستخدمين والنماذج والقوالب والبيانات. توفر جانغو مرونة كبيرة من خلال دعم العروض المعتمدة على الدوال والأصناف، ما يتيح للمطورين اختيار الأسلوب الأنسب لتطبيقاتهم حسب متطلبات المشروع. كما أن الفهم العميق لطريقة معالجة العروض لطلبات الويب يمكن أن يُحسن الأداء ويُسهم في بناء تطبيقات قوية وقابلة للتوسع وسهلة الصيانة.
المصادر
-
Django Project Documentation: https://docs.djangoproject.com/en/stable/topics/http/views/
-
Two Scoops of Django 3.x – Audrey Roy Greenfeld, Daniel Roy Greenfeld

