0%
تطوير الويب باستخدام Django

تطوير الويب باستخدام Django

كيف تبني تطبيقات ويب قوية باستخدام إطار العمل Django.

I

InSkillCoach

· دقيقة

تطوير الويب باستخدام Django

Django هو إطار عمل ويب عالي المستوى مكتوب بلغة Python، ويشجع على التطوير السريع والنظيف. وبفضل فلسفته القائمة على مبدأ “batteries included”، يوفّر Django كل ما تحتاج إليه لبناء تطبيقات ويب قوية وسهلة الصيانة.

لماذا تختار Django؟

يقدّم Django مزايا كثيرة في تطوير الويب:

  • سرعة في التطوير: يتبع Django مبدأ DRY (Don’t Repeat Yourself) ويؤتمت مهامّ كثيرة
  • آمن افتراضيًا: حماية من الثغرات الشائعة في الويب (XSS وCSRF وحقن SQL…)
  • قابل للتوسّع: تستخدمه مواقع ذات حركة مرور عالية مثل Instagram وPinterest وDisqus
  • Batteries included: ORM مدمج، ولوحة إدارة تلقائية، ونظام قوالب، ومصادقة…
  • مجتمع نشط: توثيق ممتاز وموارد كثيرة متاحة

التثبيت والإعداد

للبدء مع Django، ثبّته عبر pip:

# Créer un environnement virtuel
python -m venv venv
source venv/bin/activate  # Sur Windows: venv\Scripts\activate

# Installer Django
pip install django

# Créer un nouveau projet
django-admin startproject monsite

# Naviguer vers le projet
cd monsite

# Créer une application
python manage.py startapp blog

بنية مشروع Django

يُنظَّم مشروع Django النموذجي على النحو التالي:

monsite/
    manage.py
    monsite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
    blog/
        __init__.py
        admin.py
        apps.py
        models.py
        tests.py
        views.py
        urls.py
        migrations/
        templates/
            blog/
                base.html
                index.html
                detail.html
        static/
            blog/
                css/
                js/
                images/

النماذج: تعريف بياناتك

تحدّد نماذج (Models) Django بنية بياناتك:

# blog/models.py
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User

class Category(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(unique=True)
    
    def __str__(self):
        return self.name
    
    class Meta:
        verbose_name_plural = "categories"

class Post(models.Model):
    STATUS_CHOICES = (
        ('draft', 'Brouillon'),
        ('published', 'Publié'),
    )
    
    title = models.CharField(max_length=200)
    slug = models.SlugField(unique_for_date='publish')
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts')
    body = models.TextField()
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='posts')
    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')
    
    def __str__(self):
        return self.title
    
    class Meta:
        ordering = ('-publish',)

بعد تعريف نماذجك، أنشئ عمليات الترحيل (migrations) ثم طبّقها:

python manage.py makemigrations
python manage.py migrate

العروض: منطق تطبيقك

تعالج العروض (Views) الطلبات وتعيد الاستجابات:

# blog/views.py
from django.shortcuts import render, get_object_or_404
from django.core.paginator import Paginator
from .models import Post, Category

def post_list(request, category_slug=None):
    posts = Post.objects.filter(status='published')
    category = None
    
    if category_slug:
        category = get_object_or_404(Category, slug=category_slug)
        posts = posts.filter(category=category)
    
    paginator = Paginator(posts, 10)  # 10 posts par page
    page = request.GET.get('page')
    posts = paginator.get_page(page)
    
    return render(request, 'blog/post_list.html', {
        'posts': posts,
        'category': category
    })

def post_detail(request, year, month, day, post_slug):
    post = get_object_or_404(
        Post,
        slug=post_slug,
        status='published',
        publish__year=year,
        publish__month=month,
        publish__day=day
    )
    
    return render(request, 'blog/post_detail.html', {'post': post})

عناوين URL: توجيه الطلبات

اضبط عناوين URL لتوجيه الطلبات إلى العروض المناسبة:

# blog/urls.py
from django.urls import path
from . import views

app_name = 'blog'

urlpatterns = [
    path('', views.post_list, name='post_list'),
    path('category/<slug:category_slug>/', views.post_list, name='post_list_by_category'),
    path('<int:year>/<int:month>/<int:day>/<slug:post_slug>/', views.post_detail, name='post_detail'),
]

# monsite/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls', namespace='blog')),
]

القوالب: واجهة المستخدم

تحدّد القوالب (Templates) كيفية عرض البيانات:

<!-- blog/templates/blog/base.html -->
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}Mon Blog{% endblock %}</title>
    <link rel="stylesheet" href="{% static 'blog/css/style.css' %}">
</head>
<body>
    <header>
        <h1>Mon Blog</h1>
        <nav>
            <ul>
                <li><a href="{% url 'blog:post_list' %}">Accueil</a></li>
                {% for cat in categories %}
                <li><a href="{% url 'blog:post_list_by_category' cat.slug %}">{{ cat.name }}</a></li>
                {% endfor %}
            </ul>
        </nav>
    </header>
    
    <main>
        {% block content %}
        {% endblock %}
    </main>
    
    <footer>
        <p>&copy; {% now "Y" %} Mon Blog</p>
    </footer>
</body>
</html>

<!-- blog/templates/blog/post_list.html -->
{% extends "blog/base.html" %}

{% block title %}
    {% if category %}{{ category.name }}{% else %}Articles{% endif %}
{% endblock %}

{% block content %}
    <h2>
        {% if category %}
            Articles dans la catégorie "{{ category.name }}"
        {% else %}
            Tous les articles
        {% endif %}
    </h2>
    
    {% for post in posts %}
        <article>
            <h3><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h3>
            <p class="date">Publié le {{ post.publish }} par {{ post.author }}</p>
            <p>{{ post.body|truncatewords:30|linebreaks }}</p>
        </article>
    {% empty %}
        <p>Aucun article disponible.</p>
    {% endfor %}
    
    {% include "pagination.html" with page=posts %}
{% endblock %}

إدارة Django

يوفّر Django واجهة إدارة جاهزة للاستخدام:

# blog/admin.py
from django.contrib import admin
from .models import Category, Post

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    list_display = ('name', 'slug')
    prepopulated_fields = {'slug': ('name',)}

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'slug', 'author', 'publish', 'status')
    list_filter = ('status', 'created', 'publish', 'author')
    search_fields = ('title', 'body')
    prepopulated_fields = {'slug': ('title',)}
    raw_id_fields = ('author',)
    date_hierarchy = 'publish'
    ordering = ('status', 'publish')

تشغيل خادم التطوير

لاختبار تطبيقك:

python manage.py runserver

افتح http://127.0.0.1:8000/ في متصفحك.

ميزات متقدمة

يقدّم Django ميزات متقدمة كثيرة:

  • المصادقة: نظام متكامل لإدارة المستخدمين
  • النماذج (Forms): إنشاء النماذج والتحقق منها ومعالجتها
  • الاختبارات: إطار اختبار مدمج
  • التدويل: دعم تعدد اللغات
  • التخزين المؤقت: عدة مستويات من التخزين المؤقت
  • الأمان: حماية من الهجمات الشائعة

النشر

لنشر تطبيق Django في بيئة الإنتاج:

  1. اضبط إعدادات الإنتاج في settings.py
  2. اجمع الملفات الثابتة: python manage.py collectstatic
  3. اختر خادم WSGI مثل Gunicorn أو uWSGI
  4. اضبط خادم ويب مثل Nginx أو Apache
  5. استخدم قاعدة بيانات قوية مثل PostgreSQL

الخاتمة

Django إطار عمل قوي يتيح لك بناء تطبيقات ويب معقدة وآمنة بسرعة. وتجعل منه فلسفته القائمة على “batteries included” وبنيته المنظَّمة جيدًا خيارًا ممتازًا لمطوري Python الراغبين في إنشاء مواقع ويب قوية وسهلة الصيانة.

سواء كنت تبني مدونة بسيطة أو موقع تجارة إلكترونية أو تطبيق ويب معقدًا، يزوّدك Django بالأدوات اللازمة لإنجاح مشروعك.

InSkillCoach

نبذة عن InSkillCoach

خبير في التدريب والتقنيات

مدرّب متخصص في التقنيات المتقدمة والذكاء الاصطناعي، تدعمه شركة GNeurone Inc.

الشهادات:

  • AWS Certified Solutions Architect – Professional
  • شهادات Google Cloud
  • Microsoft Certified: DevOps Engineer Expert
  • Certified Kubernetes Administrator (CKA)
  • CompTIA Security+
1.6k
128

التعليقات

التعليقات مدعومة عبر GitHub Discussions

سجّل الدخول باستخدام GitHub للمشاركة في النقاش

تم نسخ الرابط!