إدارة الملفات الساكنة في Django: دليل شامل

في هذا البرنامج التعليمي، سنلقي نظرة على ما هي الملفات الساكنة في Django، فوائد إدارتها بفعالية، هدفها في تطبيقات الويب، وسنقوم بإعداد مشروع تجريبي لشرح كيفية إدارة وتقديم الملفات الساكنة باستخدام طرق وأدوات مختلفة.

Table of Contents

Django هو إطار عمل مبني على Python عالي المستوى يوفر أدوات قوية لمطوري الويب لإنشاء تطبيقات الويب بسرعة وكفاءة.

على الرغم من أن Django مثالي لـ إنشاء تطبيقات الويب بسرعة وكفاءة، إلا أنه من المهم بنفس القدر أن تهتم بشكل وملمس تطبيقات الويب التي تطورها. من أجل القيام بذلك، يجب أن تتعلم كيفية ادارة الموارد التي تدعم وتوفر الشكل والملمس لتطبيقاتك.

الملفات الثابتة في Django

في Django، الملفات الثابتة هي تلك الملفات التي يتم توصيلها مباشرة بالعميل دون أي معالجة من الخادم.

وهي عادة ما تشمل ملفات CSS، ملفات JavaScript، صور، أيقونات، خطوط وموارد أخرى ضرورية للشكل والملمس لتطبيق الويب الخاص بك.

يوفر Django آليات لإدارة وتقديم هذه الملفات الثابتة بكفاءة، مما يضمن تجربة سلسة للمستخدم.

إدارة الملفات الثابتة بكفاءة

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

التنظيم وتخزين الملفات الثابتة بشكل صحيح سيضمن زمن تحميل الصفحات السريع، وأن يتحسن الاستجابة، مما يعزز الإرضاء العام للمستخدم.

يقدم Django عدد من الأدوات والاتفاقيات لمساعدة في معالجة الملفات الثابتة.

الغرض من الملفات الثابتة في تطبيقات الويب

الملفات الثابتة مهمة جدا، حيث تحدد كيف يبدو ويشعر تطبيق الويب. فهي تعرف كيف يتم تصميم المكونات في التطبيق، وكيف يتصرفون في الاستجابة للتفاعلات المستخدم، وفي النهاية ما يراه المستخدم عندما يزور تطبيق ويب معين.

عندما تقوم بتوفير الملفات الثابتة بكفاءة، ستتمكن من إنشاء واجهة مستخدم جذابة ومستجيبة، مما يجعل التطبيق أكثر جذبًا وصديقًا للمستخدم.

إعداد مشروع مثالي

لشرح مفاهيم إدارة الملفات الثابتة في Django، سنقوم بإعداد مشروع مثالي من البداية.

سيشمل هذا المشروع إنشاء مشروع Django، تكوين إعدادات الملفات الثابتة، ودمج الملفات الثابتة في تطبيق ويب بسيط.

باتباع المشروع المثالي، ستحصل على تجربة فعالة في إدارة الملفات الثابتة في Django وتفهم أهميتها في تطوير الويب.

لأغراض هذا البرنامج التعليمي، سنقوم بإنشاء صفحة دعاية بحيث عندما يزور المستخدمون الصفحة الرئيسية لمشروعنا، سيرون عنوانًا متصفًا يرحب بهم في الموقع. سيعرض أيضًا تاريخ اليوم باستخدام JavaScript، وسنقوم أيضًا بتوفير صورة لإكمال الصفحة.

إنشاء دليل لتخزين المشروع

لنبدأ بإنشاء دليل سيحتوي على المشروع المثالي باستخدام الأمر التالي:

mkdir sitepoint_django_static_tut

إنشاء بيئة افتراضية

يُنصح بإنشاء وعزل المشاريع الجديدة في بيئات افتراضية. وهذا يعني أن كل مشروع سيكون له متطلبات إضافية خاصة به دون التأثير على التثبيت العام لـ Python.

سنستخدم حزمة virtualenv لإنشائها. إذا لم تكن مثبتة في بيئة التطوير الخاصة بك، قم بتثبيتها باستخدام pip install virtualenv، وأنشئ بيئة افتراضية باستخدام الأمر التالي:

virtualenv myenv

ينشئ الأمر أعلاه بيئة افتراضية اسمها myenv. لاستخدام البيئة الافتراضية، يجب تنشيطها:

Linux/macOS:

. myenv/bin/activate

Windows:

. myenv\Scripts\activate

تثبيت المركبات

بمجرد تنشيط البيئة الافتراضية، يمكنك الآن المضي قدمًا وتثبيت مركبات مشروعك. في البداية، سنقوم بتثبيت Django. سنقوم بتثبيت مركبات أخرى عندما نصل إلى الأقسام التي توضح استخدامها:

pip install Django

سيثبت هذا أحدث إصدار مستقر من Django، والذي كان عند الكتابة هو الإصدار 5.0.

إنشاء مشروع Django

بعد تثبيت Django بنجاح، لديك الآن إمكانية الوصول إلى أوامر إدارة Django. دعونا نستخدمها لإنشاء مشروع Django في البيئة الافتراضية:

django-admin startproject sitepoint_django .

سينشئ الأمر أعلاه مشروع Django اسمه sitepoint_django والنقطة في النهاية تشير إلى أننا نرغب في إنشاء المشروع في الدلالة الحالية.

إنشاء تطبيق تجريبي

لشرح مفاهيم مختلفة لإدارة الملفات الساكنة، نحتاج إلى إنشاء تطبيق Django على الأقل في مشروعنا:

python manage.py startapp  static_demo

سيخلق هذا تطبيقًا جديدًا في مشروعنا باسم `static_demo`. لكي يتم التعرف عليه في مشروعنا ، يجب إضافته إلى إعدادات تطبيقات التثبيت في ملف `settings.py` لمشروعنا. افتح `sitepoint_django/settings.py` ، انتقل إلى إعداد `INSTALLED_APPS` وأضف `static_demo.apps.StaticDemoConfig` إلى نهاية القائمة ، كما هو موضح أدناه:

# sitepoint_django/settings.py

INSTALLED_APPS = [
    # apps أخرى
    'static_demo.apps.StaticDemoConfig',
]

إنشاء قالب صفحة المنزل

سنقوم بعرض بعض الHTML عندما يزور المستخدم صفحة المنزل في موقعنا. في تطبيق `static_demo` ، قم بإنشاء دليل `templates` ، وفيه أنشئ دليلًا آخر وسمه `static_demo`. في هذا الدليل ، قم بإنشاء قالب وسمه `index.html` حتى يكون المسار `static_demo/templates/static_demo/index.html`.

أدخل الكود التالي في `index.html`:

<!-- static_demo/index.html -->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Sitepoint Django Tutorial</title>
</head>
<body>
    <h2>Hello there, welcome to our great site!</h2>
</body>
</html>

إنشاء واجهة المطور الرئيسية

لكي يتم عرض القالب للمستخدمين عندما يزورون صفحة المنزل في تطبيقنا ، نحتاج إلى إنشاء وظيفة العرض التي ستتم تشغيلها لعرض قالب `home.html`. افتح ملف `static_demo/views.py` وأدخل الكود التالي:

# static_demo/views.py

from django.shortcuts import render

def index(request):
    return render(request, "static_demo/home.html")

إنشاء ملف URL الخاص بـ static_demo

نريد نمط العرض الأساسي في تطبيق static_demo لعرض الصفحة الرئيسية كلما زار المستخدم موقعنا. لذا سنقوم بإنشاء مخطط URL لدالة العرض التي ستعرض الصفحة الرئيسية. لذلك، نحتاج إلى إنشاء ملف urls.py لتطبيق static_demo، ثم ربط ملف URL static_demo بملف URL المشروع.

ومن ثم، في تطبيق static_demo، قم بإنشاء ملف وسمه urls.py وأضف التعليمات البرمجية التالية إليه:

# static_demo/urls.py

from django.urls import path
from .import views

app_name = 'static_demo'

urlpatterns = [
    path('', views.index, name="index"),
]

التعليمات البرمجية أعلاه تخلق URL لعرض الفهرس في مشروعنا، لذا إذا زار المستخدم شيئًا مثل http://oursite.com/، أو إذا زرت http://127.0.0.1:8000 في التطوير، سيتم استدعاء عرض الفهرس للرد على ذلك.

دعنا نضيفه إلى ملف URL المشروع. افتح ملف sitepoint_django/urls.py وأضف التعليمات البرمجية التالية:

# sitepoint_django/urls.py

from django.contrib import admin
from django.urls import path, include # أضف استيرادًا لـ include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('static_demo.urls')), # أضف هذا السطر
]

التعليمات البرمجية أعلاه تغير بعض الأشياء في ملف urls.py الافتراضي. لقد أضفنا استيرادًا لدالة include، مما يخبر Django أننا نشمل static_demo.urls.

اختبار المشروع

تم الإعداد الأولي للمشروع في هذه المرحلة. دعنا نشغل خادم التطوير لنرى إذا كان كل شيء مرتبطًا بشكل جيد.

قم بتشغيل المشروع بالأمر التالي:

python manage.py runserver

إذا تم إعداد كل شيء بشكل صحيح، يجب أن تتمكن من زيارة http://127.0.0.1:8000. سترى بعض النصوص غير المتسلسلة التي ترحب بك في الموقع.

توفير الملفات الثابتة في التطوير

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

إعداد دليل الملفات الثابتة

يوصي Django بأن يتم إدارة جميع الموارد الثابتة بشكل تطبيقي: أي أن جميع CSS و JS والصور التي يحتاجها تطبيق معين يجب أن يكون موجودًا في نطاق هذا التطبيق. لذا دعونا نقوم بتحديث تطبيق static_demo وإنشاء دليل باسم static، وداخله إنشاء دليل آخر باسم static_demo. ثم في دليل static_demo أنشأ ثلاثة أدلة أخرى: css، js، و images. في النهاية، سيكون لدينا بنية مشابهة للتالي:

static_demo/
    └── static/
        └── static_demo/
            ├── css/
            ├── js/
            └── images/

السبب وراء إنشاء دليل static_demo في دليل static هو لمساعدتك في تسمية سمات الموارد الثابتة. إذا كان لديك أكثر من تطبيق واحد، وكان CSS في كلا التطبيقين باسم styles.css، فسيعمل Django فقط مع أول ملف تعريف أوراق المعايرة التي يجدها، حيث لن يتمكن من التمييز بين الآخرين. لذلك، نسمّيها حتى يتمكن Django من معرفة الملف الذي نشير إليه في قوالبنا.

إنشاء الملفات الثابتة

في هذه الخطوة، لنقم بإعداد مواد ساكنة أدنى تبين لك كيف يمكنك خدمة الملفات في التطوير.

في الدليل js، قم بإنشاء ملف وسمه todays_date.js، وأضف الكود التالي:

/* static_demo/js/todays_date.js */

let formattedDate = new Date().toLocaleDateString();

document.getElementById('todaysDate').innerText = `The date today is ${formattedDate}`;

الكود أعلاه يحصل على تاريخ اليوم من JavaScript، يقوم بتنسيقه إلى سلسلة، ثم يعرضه في div بمعرف todaysDate.

في الدليل css، قم بإنشاء ملف، سمه styles.css، وأضف الكود التالي:

/* static_demo/css/styles.css */

body {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    margin: 0;
}

h2 {
    font-size: 24px; 
    color: green;
}

الكود أعلاه يستخدم تخطيط Flexbox لتوازن جميع العناصر على الصفحة أفقياً ورأسياً. كما يحدد حجم خط عنصر H2 إلى 24px ولونه إلى الأخضر.

بالنسبة للصورة، يمكنك استخدام أي صورة ترغب فيها. قم بنسخ بعض الصور إلى الدليل images وانتبه لاسمها.

تكوين إعدادات الملفات الساكنة

لخدمة الملفات الساكنة في التطوير، يجب تعيين عدد من الأشياء في ملف Django settings.py. افتح ملف sitepoint_django/settings.py وتحقق لمعرفة ما إذا كانت لديك الإعدادات التالية:

# sitepoint_django/settings.py`

DEBUG=True

في التطوير، من المستحسن عمومًا تعيين DEBUG إلى True في إعدادات مشروع Django الخاص بك. يمكّن هذا الإعداد من ميزات التصحيح المختلفة، بما في ذلك رسائل الخطأ المفصلة وتعقب الأخطاء، والتي هي لا بد أن تكون ثمينة لتشخيص وإصلاح المشاكل خلال التطوير.

إضافةً إلى ذلك، عندما يكون DEBUG معيّنًا إلى True، يقوم تطبيق django.contrib.staticfiles تلقائيًا بتوفير الملفات الساكنة من دليل static لكل تطبيق. يبسط هذا السلوك عملية التطوير عن طريق التخلص من الحاجة إلى التكوين اليدوي لتوفير الملفات الساكنة.

في إعداد INSTALLED_APPS، تحقق لمعرفة ما إذا كان تطبيق django.contrib.staticfiles مضافًا. إذا لم يكن كذلك، أضفه فوق التطبيقات التي لديك في المشروع. على سبيل المثال، في هذا المشروع أضفه فوق سلسلة تطبيق static_demo، كما هو موضح أدناه:

# sitepoint_django/settings.py`

INSTALLED_APPS = [

    'django.contrib.staticfiles',
    'static_demo.apps.StaticDemoConfig',
]

يوفر تطبيق django.contrib.staticfiles الذي يقدمه Django أمرًا ضروريًا لتوفير الملفات الساكنة خلال التطوير. بشكل افتراضي، يتنقل خلال تطبيقات مشروعك لتحديد الدلائل التي توجد بها الملفات الساكنة في كل تطبيق. ومع ذلك، إذا كان لديك مواد ساكنة إضافية ليست مرتبطة بتطبيق معين، فيمكنك لا تزال تمكينها من الوصول إلى django.contrib.staticfiles عن طريق تحديد إعداد STATICFILES_DIRS في ملف settings.py لمشروعك. يتيح لك هذا الإعداد تحديد المجلدات الإضافية التي توجد بها الملفات الساكنة. على سبيل المثال:

# sitepoint_django/settings.py`

STATICFILES_DIRS = [
    "/dir/with/staticfiles/static",
    "/someother/dir/static",
    "/home/example.com/static",
]

إلى جانب DEBUG و STATICFILES_DIRS، توجد إعدادات مهمة أخرى يجب تضمينها في ملف تكوين مشروع Django الخاص بك وهي STATIC_URL. على الرغم من أن Django يوفر قيمة افتراضية لـ STATIC_URL، يمكنك تحديدها صراحة في ملف settings.py الخاص بك إذا لم تكن موجودة بالفعل.

يحدد الإعداد STATIC_URL الرابط الأساسي الذي سيتم خدمة الأصول الثابتة منه. على سبيل المثال، تحديد STATIC_URL = "static/" يوجه Django لخدمة الأصول الثابتة من مسار الرابط /static/. وهذا يعني أن ملف الأنماط الموجود في تطبيق static_demo سيكون قابلاً للوصول على صفحة الرابط مثل http://127.0.0.1:8000/static/static_demo/css/styles.css.

تحديث القالب

بعد التعامل مع الإعدادات، لاستخدام الملفات الثابتة في القالب، يجب تحديثه بهذا الكود HTML:

<!-- static_demo/index.html -->

<!-- add static file handling functionality -->
{% load static %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Sitepoint Django Tutorial</title>

    <!-- link to css  below -->
    <link rel="stylesheet" href="{% static 'static_demo/css/styles.css'%}"> 
</head>
<body>
    <h2>Hello there, welcome to our great site</h2>
    <p id="todaysDate"></p>
    <!-- link to image  below -->
    <img src="{% static 'static_demo/images/flowerImage.png' %}" alt="Flower Image"> 

    <!-- link to js  below -->
    <script src="{% static 'static_demo/js/todays_date.js' %}"></script>
</body>
</html>

يعرض هذا التحديث علينا علامة جديدة: {% load static %}. تحميل هذه العلامة للوظيفة التي تعالج الملفات الثابتة التي يوفرها محرك تemplating Django. تمكننا تضمين هذه العلامة في ملف قالب Django من استخدام علامات القالب والمرشحات المتعلقة بالملفات الثابتة.

على سبيل المثال، استخدامه في قالبنا يمكّننا من استشهاد بملفات ثابتة مثل الصور و CSS و JS في عناصر HTML. استخدامه أيضًا يمكّن Django من توليد URLs للمراجع الثابتة للأصول:

<link rel="stylesheet" href="{% static 'static_demo/css/styles.css'%}"> 

<img src="{% static 'static_demo/images/flowerImage.png' %}" alt="Flower Image"> 

<script src="{% static 'static_demo/js/todays_date.js' %}"></script>

بعد وضع تلك الإعدادات وتحديث القالب، يجب أن نقوم بتشغيل المشروع ونرى إن كانت الملفات تُقدّم في التطوير. قم بتشغيل المشروع باستخدام الأمر التالي:

python manage.py runserver

إذا تم إعداد كل شيء بشكل صحيح، يجب أن يكون خادم التطوير قيد التشغيل على http://127.0.0.1:8000. إذا زرنا تلك الرابط، يجب أن يكون لدينا صفحة مشابهة للآتية.

امتلاك صورة مماثلة تشير إلى أن الملفات الثابتة قد تم تطبيقها بشكل صحيح.

يجب أن تلاحظ أنه في تطوير Django، عندما DEBUG=True في إعدادات مشروعك، وتم تمكين django.contrib.staticfiles، هذا يسمح لخادم Django التطويري (runserver) بتقديم الملفات الثابتة. في هذا السيناريو، أي تغييرات تُجرى على الملفات الثابتة، مثل CSS أو JavaScript أو الصور، تُكتشف تلقائيًا وتُطبق بواسطة Django. هذه العملية السلسة تبسّط التطوير بشكل كبير، حيث سترى تأثير تغييراتك على الفور دون الحاجة إلى تحديث الخادم يدويًا أو إعادة تشغيله.

ومع ذلك، في بيئات الإنتاج، عادةً ما ينطوي تقديم الملفات الساكنة على استخدام خادم ويب آخر أو CDN. في هذه الحالة، قد لا تتم الكشف عن التغييرات في الملفات الساكنة تلقائيًا وتطبيقها بواسطة Django، مما يتطلب تدخلًا يدويًا لضمان توصيل الملفات المحدثة إلى المستخدمين. علاوةً على ذلك، إذا اخترت تقديم الملفات الساكنة يدويًا باستخدام طريقة مختلفة، مثل مشروع django.views.static.serve()، قد لا يحدث الكشف التلقائي وتطبيق التغييرات، وقد تحتاج إلى تنفيذ آلياتك الخاصة لمعالجة تحديثات الملفات الساكنة.

تقديم الملفات الساكنة باستخدام WhiteNoise

في التطوير، بينما django.contrib.staticfiles تبسط عملية تقديم الموارد الساكنة، مؤكدًا تحديثات سلسة مع إجراء التغييرات.

ومع ذلك، عند الانتقال إلى الإنتاج، يجب تعطيل الإعدادات مثل DEBUG=True، وقد يتم تقديم الملفات الساكنة من CDN أو خادم آخر. هذا يتطلب حلًا يربط بين كلا البيئتين – مما يسمح بتقديم الملفات بسلاسة أثناء التطوير بينما يعكس بدقة البيئة الإنتاجية.

تدخل حزمة WhiteNoise. مصممة لتتماسك بسلاسة مع Django، توفر WhiteNoise حلًا قويًا لتقديم الملفات الساكنة في كل من بيئات التطوير والإنتاج، مما يوفر نهجًا موحدًا يضمن الاتساق والموثوقية عبر مراحل النشر. دعونا نستكشف WhiteNoise.

تثبيت وتكوين WhiteNoise في Django

بدء العمل مع WhiteNoise سهل. في هذا القسم، سنرشدك عبر عملية التثبيت ونوضح لك كيفية تكوين WhiteNoise داخل مشروع Django الخاص بك.

نقوم بتثبيت WhiteNoise على النحو التالي:

pip install whitenoise

بعد التثبيت الناجح، اتجه إلى sitepoint_django/settings.py، انتقل للأسفل حتى النهاية، وابحث عن الإعداد STATIC_URL. تحته، أضف الإعداد STATIC_ROOT:

# sitepoint_django/settings.py

STATIC_ROOT = BASEDIR / "staticfiles"

يخبرك الإعداد أعلاه أن Django عندما يتم تشغيل collectstatic سيجمع جميع الأصول الثابتة في جميع التطبيقات في مشروعك ويخزنها في الدليل المسمى staticfiles.

الخطوة التالية هي تشغيل أمر الإدارة collectstatic:

python manage.py collectstatic

لتمكين WhiteNoise، يجب إضافته إلى قائمة إعدادات MIDDLEWARE، قم بتحرير ملف settings.py، وأضف وسيطة WhiteNoise بعد وسيطة Django SecurityMiddleware وقبل جميع الوسائط الأخرى:

# sitepoint_django/settings.py

MIDDLEWARE = [
    # ...
    "django.middleware.security.SecurityMiddleware",
    "whitenoise.middleware.WhiteNoiseMiddleware",
    # ...
]

استخدام WhiteNoise في التطوير

مع الخطوات أعلاه، يمكن لـ WhiteNoise توفير ملفاتك الثابتة في الإنتاج. ولكن إذا قمت بتشغيل المشروع في هذه المرحلة، سيتولى خادم التطوير Django تحكم الملفات الثابتة تلقائيًا. ولكي تستفيد من سلوك مماثل في التطوير وفي الإنتاج، من الجيد استخدامه لتوفير الملفات في التطوير أيضًا.

للقيام بذلك، سنعتقد معالجة Django للملفات الثابتة ونسمح لـ WhiteNoise بأن يتولى المهمة ببساطة عن طريق تعديل ملف الإعدادات وإضافة WhiteNoise إلى قائمة INSTALLED_APPS وضع فوق django.contrib.staticfiles:

# sitepoint_django/settings.py

INSTALLED_APPS = [
    # ...
    "whitenoise.runserver_nostatic",
    "django.contrib.staticfiles",
    # ...
]

كما تحتاج إلى تعطيل DEBUG عن طريق تعيينه إلى False:

# sitepoint_django/settings.py

DEBUG=False

بهذه الخطوات، يمكنك خدمة الأصول الثابتة الخاصة بك بسلاسة باستخدام حزمة WhiteNoise.

للتحقق مما إذا كان WhiteNoise يخدم بالفعل ملفاتك، يمكنك إزالة أو تعليق خيار django.contrib.staticfiles من قائمة INSTALLED_APPS. ومع ذلك، من المهم التنويه إلى أن إزالة django.contrib.staticfiles ستجعل بعض أوامر إدارة الملفات الثابتة غير متاحة، مثل أمر collectstatic. هذا الأمر ضروري لجمع وتكديس الملفات الثابتة من تطبيقاتك إلى مجلد واحد للخدمة الفعالة في البيئات الإنتاجية.

خيارات تكوين WhiteNoise المتقدمة

على الرغم من أن الخطوات المذكورة أعلاه كافية لمعظم الحالات، إلا أن WhiteNoise يوفر عددًا إضافيًا من الخيارات للتكوين. على سبيل المثال، يمكنك إضافة الضغط ودعم التخزين المؤقت إلى مشروعك. لتمكينها، افتح ملف sitepoint_django/settings.py وأضف الإعدادات التالية:

# sitepoint_django/settings.py

STORAGES = {
    # ...
    "staticfiles": {
        "BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage",
    },
}

سيضمن الإعداد أعلاه أن WhiteNoise يضغط ويجعل اسم الملفات الثابتة فريدًا من خلال تجزئتها، لذا ستتم تخزينها بأمان.

استخدام WhiteNoise في بيئات الاستضافة المشتركة

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

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

تحديات إدارة الملفات الثابتة في الاستضافة المشتركة

على الرغم من أن الاستضافة المشتركة توفر حلاً استضافيًا ميسرًا وبمتانة للعديد من المواقع، إلا أنها تملك قيودًا مقارنة بأنواع الاستضافة الأخرى، مثل الخوادم الخاصة بالخدمات الافتراضية (VPS) أو الخوادم المخصصة. تشمل هذه القيود ما يلي:

  • القيود على تهيئة وإعدادات الخادم، مما يحد من القدرة على تخصيص برنامج الخادم أو تثبيت أدوات إضافية.

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

  • قد يشكل الأداء تحد آخر في الاستضافة المشتركة، حيث يمكن أن يؤدي مشاركة الموارد مع المستخدمين الآخرين إلى زيادة فترات تحميل الملفات الساكنة، خاصة خلال فترات الزيادة في الحركة المرورية أو استخدام الموارد.

تكوين استخدام WhiteNoise

WhiteNoise هو حزمة Python تدمج بسلاسة مع Django، مما يجعلها الخيار المثالي لتوزيع الملفات الساكنة في بيئات الاستضافة المشتركة. على عكس تثبيتات البرامج الأخرى مثل Apache و Nginx، التي قد لا تكون مسموح بها في بعض بيئات الاستضافة، يمكن تثبيت WhiteNoise بسهولة إلى جانب الحزم الأخرى لمشروعك.

من خلال تكوين Django لاستخدام WhiteNoise، يمكنك خدمة ملفات الوسائط الثابتة بفعالية مباشرة من تطبيق Django الخاص بك دون الحاجة إلى برامج خادم إضافية. هذا يبسط عملية الإعداد ويضمن توافقًا مع مجموعة واسعة من مزودي الاستضافة.

معظم مزودي الاستضافة المشتركة توفر لك برنامج cPanel يسمح لك بإجراء تكوينات الخادم ورفع الملفات. بمجرد رفع ملفاتك، يمكنك إجراء التغييرات التالية في ملف settings.py للمشروع:

# sitepoint_django/settings.py

STATIC_URL='static/'

# استبدل اسم المستخدم باسم مستخدم cpanel الخاص بك
# استخدم public_html إذا كنت تعمل على المجال الرئيسي مثل https://example.com
STATIC_ROOT='/home/username/public_html/static'

# أو 
# استخدم اسم المجلد إذا كنت تعمل على نطاق ثانوي مثل https://subdomain.example.com
STATIC_ROOT='/home/username/subdomain.mydomain.com/static'

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

توصيل ملفات الوسائط الثابتة من AWS S3

خدمة تخزين Amazon Simple (S3) هي خدمة تخزين شاملة للعناصر التي تقدمها خدمات الويب Amazon (AWS). تمكن المستخدمين من إنشاء مساحات تخزين تعرف بالدلائل حيث يمكنك تخزين أنواع البيانات المختلفة مثل المستندات والصور ومقاطع الفيديو والملفات الثابتة البارزة في برنامجنا التعليمي.

AWS يقدم خطًا مجانيًا لعدة من خدماته، بما في ذلك Amazon S3. الخط المجاني يسمح للمستخدمين بالبدء باستخدام خدمات AWS دون تكلفة لفترة معينة أو حتى حدود محددة من الاستخدام. للبدء، يمكنك التسجيل في الخط المجاني لـ S3. ومع ذلك، لإكمال عملية التسجيل ستحتاج إلى تزويد بمعلومات الدفع.

إنشاء سلة الـ S3

لإنشاء سلة، انتقل إلى لوحة التحكم في S3 وانقر على زر إنشاء سلة.

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

تمكين ACL للسلة.

تمكين الوصول العام للسلة، عن طريق إيقاف تشغيل منع كل الوصول العام.

بعد الإنشاء الناجح، يجب أن ترى سلتك على الصفحة الرئيسية لـ S3.

تمكين الوصول IAM

بعد إنشاء سلة، يمكنك استخدام السلة كمستخدم جذر، لكن AWS يوصي بإنشاء مجموعة IAM (Identity Access Management) وتعيينهم وصولًا إلى سلة معينة فقط.

إنشاء مجموعة IAM

انتقل إلى الصفحة الرئيسية لـ IAM وحدد مجموعات المستخدمين في الشريط الجانبي. ثم انقر على زر إنشاء مجموعة. أعط المجموعة اسمًا.

ثم تحت علاقة السلطات المرفقة، ابحث عن S3 وعيّن AmazonS3FullAccess ثم انقر على زر إنشاء مجموعة.

إنشاء مستخدم IAM

أثناء البقاء على صفحة IAM، اختر المستخدمون في اللوحة اليسرى وانقر على زر إنشاء مستخدم.

أعط مستخدم IAM اسمًا وانقر على زر التالي.

تحت خيار تعيين الأذونات، اترك إضافة المستخدم إلى المجموعة كخيار المحدد، ثم انتقل إلى مجموعات المستخدمين واختر مجموعة المستخدم التي أنشأتها أعلاه ثم انقر على زر التالي.

قم بالمراجعة وانقر على إنشاء مستخدم.

الآن انقر على اسم المستخدم لعرض تفاصيل المستخدم. انقر على علامة التبويب الشهادات الأمنية ثم انقر على إنشاء مفتاح دخول. اختر رمز المحلي وانقر على زر التالي.

بعد ذلك، انقر على زر إنشاء مفتاح دخول. يمكنك نسخ المفاتيح إلى ملف .env إذا كان لديك واحد، أو تنزيل ملف CSV للاستخدام فيما بعد.

تهيئة Django لاستخدام AWS S3 للملفات الثابتة

بعد إنشاء خزانة S3، نحتاج إلى تهيئة المشروع لتقديم الملفات من S3. في القسم السابق، قمنا بتهيئة WhiteNoise لتقديم مواردنا الثابتة. نحتاج إلى تعطيل WhiteNoise حتى نتمكن من تقديم الموارد من S3. للقيام بذلك، انتقل إلى ملف sitepoint_django/settings.py والتعليق على الأسطر المتعلقة بالتعليمات البرمجية:

# sitepoint_django/settings.py

INSTALLED_APPS = [
    # ...
    # "whitenoise.runserver_nostatic",
    # ...
]

MIDDLEWARE = [
    # ...
    # "whitenoise.middleware.WhiteNoiseMiddleware",
    # ...
]

# STORAGES = {
#     "staticfiles": {
#         "BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage",
#     },
# }

الكود أعلاه يعلق كل الإعدادات التي وضعناها لـ WhiteNoise.

تثبيت الحزم

لكي يتمكن المشروع من العمل مع S3، نحتاج لتثبيت حزمتين: boto3 و django-storages. توفر boto3 الواجهة الأساسية للبرمجة البايثون للتفاعل مع خدمات AWS، بينما توسع django-storages قدرات Django في مجال تخزين الملفات ليتمكن من التكامل مع مزودي تخزين السحاب مثل Amazon S3، مما يتيح لك إدارة وتقديم الملفات الثابتة والوسائط في تطبيق Django الخاص بك بشكل متسق:

pip install boto3 django-storages

تكوين الإعدادات

لكي يتمكن مشروعنا من خدمة الملفات من S3، نحتاج لعمل بعض التغييرات في ملف settings.py وتحديثه بالكود التالي:

# sitepoint_django/settings.py
import os  # أولاً أضف استيرادًا لوحدة os

# إعدادات تخزين S3
STORAGES = {
    'staticfiles': {
        'BACKEND': 'storages.backends.s3boto3.S3Boto3Storage',
        'OPTIONS': {
            'bucket_name': os.getenv('AWS_STORAGE_BUCKET_NAME'),
            'location': 'static',
            'querystring_auth': False,
        },
    }
}

تعديلات الإعدادات أعلاه لخلق قاموس STORAGES يعمل كحاوية تكوين مركزية لتحديد خلفيات تخزين مختلفة استخدمت داخل المشروع.

من المهم التنويه بأن هذا الإعداد متاح فقط لإصدارات Django من 4.2 فأكثر. بالنسبة للإصدارات السابقة، تحقق من الوثائق.

في الكود أعلاه، لدينا إعداد لـ staticfiles يحدد تكوين التخزين لإدارة الملفات الثابتة.

بعد إعدادات STORAGES نحتاج إلى إضافة بعض الإعدادات الخاصة بـ AWS في ملف الإعدادات لدينا، لذا انتقل إلى الجزء الذي ستجد فيه إعداد STATIC_URL وأجرِ التغييرات التالية:

# sitepoint_django/settings.py

USE_S3 = os.getenv('USE_S3')

if USE_S3:
    AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID')
    AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY')
    AWS_S3_OBJECT_PARAMETERS = {
        "CacheControl": "max-age=2592000",
    }

else:
    STATIC_URL = 'static/'
    STATIC_ROOT = BASE_DIR / 'staticfiles'

تحميل الملفات الثابتة إلى S3

بمجرد وضع الإعدادات، المهمة التالية هي تحميل ملفاتك الثابتة إلى خزانة S3. تفعل ذلك عن طريق تشغيل collectstatic:

python manage.py collectstatic  --no-input

سيجمع هذا جميع الملفات الثابتة في تطبيقات مشروعنا، وينقلها إلى خزانة S3، ويضعها في مجلد static كما تم تحديده في قاموس STORAGES. العلم --no-input يأمر Django بالتشغيل في وضع غير تفاعلي، متجاهلًا أي تساؤلات للمدخل المستخدم.

عند الاستخدام، سيقوم Django تلقائيًا بعملية تجميع ملفات الوسائط الثابتة دون الحاجة إلى تدخل أيديوي من المستخدم.

تشغيل المشروع

بمجرد وضع جميع الإعدادات، يمكنك تشغيل المشروع. فلنقم بتشغيل المشروع في التطوير وتقديم الملفات من سلة التخزين S3:

python manage.py runserver

للتحقق من أنك في الواقع تقدم الملفات من S3، يمكنك مشاهدة مصدر كود الصفحة الرئيسية:

<link rel="stylesheet" href="https://sitepoint-django-static.s3.amazonaws.com/static/static_demo/css/styles.css">

<img src="https://sitepoint-django-static.s3.amazonaws.com/static/static_demo/images/flowerImage.png" alt="Flower Image">

<script src="https://sitepoint-django-static.s3.amazonaws.com/static/static_demo/js/todays_date.js"></script>

النظر إلى عناصر HTML يكشف أن الروابط تشير بالفعل إلى سلة التخزين S3.

الخاتمة

في الملخص، إدارة ملفات الوسائط الثابتة في Django تتطلب تقييم متطلبات المشروع، احتياجات التوسع، وقيود بيئة الاستضافة لاختيار الطريقة الأكثر ملاءمة.

على سبيل المثال، توفر Middleware WhiteNoise حل فعال لتقديم ملفات الوسائط الثابتة في بيئات الاستضافة المشتركة، حيث قد تواجه قيود الموارد والوصول المحدود إلى الخادم تحديات.

من خلال تكوين إعدادات Django بشكل صحيح والاستفادة من أدوات مثل WhiteNoise، يمكن للمطورين ضمان تقديم ملفات الوسائط الثابتة بشكل موثوق ومحسّن، بغض النظر عن بيئة الاستضافة. كل طريقة تقدم مزاياها واعتباراتها، تتطلب تقييمًا دقيقًا لتلبية احتياجات المشروع المحددة وتقديم تجربة مستخدم سلسة.

لقد غطينا عدة نقاط رئيسية:

طرق إدارة الملفات الساكنة. لقد ناقشنا طرقًا مختلفة، بما في ذلك توزيع الملفات الساكنة محليًا، استخدام خادم التطوير المدمج في Django، الاستفادة من حلول تخزين طرف ثالث مثل Amazon S3، وتوزيع الملفات باستخدام حزم مثل WhiteNoise. كل طريقة لها مزاياها واعتباراتها، اعتمادًا على عوامل مثل القابلية للتوسع، الأداء، وسهولة النشر.

الإعدادات والأوامر الشائعة:

  • STATIC_ROOT: يحدد الدليل الذي سيتم تخزين فيه الملفات الساكنة المجمعة.
  • STATIC_URL: يعرض الرابط الأساسي للوصول إلى الملفات الساكنة من خلال خادم الويب.
  • STATICFILES_DIRS: يحدد الأدلة الإضافية التي تحتوي على الملفات الساكنة.
  • STATICFILES_STORAGE: يضبط مخزن الخلفية للتعامل مع الملفات الساكنة.
  • collectstatic: يجمع جميع الأصول الساكنة من جميع دلائل التطبيقات إلى STATIC_ROOT.

المزيد من القراءة:

Source:
https://www.sitepoint.com/managing-static-files-in-django-a-comprehensive-guide/