اذهب إلى المحتوى

السؤال

نشر

أحاول أن أقوم بإنشاء موقع حيث يمكن للمستخدمين اختيار مجموعة من الصور وتنزيلها كأرشيف ZIP مضغوط. كيف أقوم بهذا الأمر في جانغو Django؟

أعتقد كذلك أن إنشاء مثل هذه الملفات لكل طلب request قد يؤدي إلى إبطاء الموقع، هل هذا الأمر صحيح؟ وهل يوجد حل لهذه المشكلة إن كان بالفعل سيسبب مشكلة في سرعة الموقع؟

 

Recommended Posts

  • 1
نشر

في Django في حال كنت تعتقد أن عملية معينة ستحتاج منك وقت عند الطلب وجعل الموقع الخاص بك أبطء فعليك بالستخدام ما يسمى ب celery 

ما هو celery هو سيرفر منفصل تقوم بإنشائه أسمه celery  تقوم من خلاله ترحيل العمليات التي تقتعد أخذ وقت إضافي ولا يحتاج المستخدم لإنتظار الصفحة حتى تنتهي من العملية على سبيل المثال العمليات الخاصة بإرسال الإيميلات و ملفات و أمور التي تحتاح وقت للعمل عليها.

طريقة عمل ذلك كتالي:(مثال)

أنشئ ملف 

proj/proj/celery.py

 

import os

from celery import Celery

# Set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

app = Celery('proj')

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django apps.
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print(f'Request: {self.request!r}')

 

كيفية أعداد celery:

اولاً عليك تثبيت RabbitMQ ينصح إستخدام أنظمة لينكس:

$ sudo apt-get install rabbitmq-server

ثم تشغيله:

قم بتشغيله في نافذة أوامر منفصلة

$ docker run -d -p 5672:5672 rabbitmq

ستظهر لك العبارة التالية Starting rabbitmq-server: SUCCESS.
لتحميل RabbitMQ من هنا.
الأن سنقوم بتثبيت Celery:

pip install celery

لنقم بإعداد أول مهمة عبر celery قم بإنشاء ملف بإسم tasks.py في مشروعك:

أضف الكود التالي في الملف:

from celery import Celery

app = Celery('tasks', broker='pyamqp://guest@localhost//')


"""
هذه دالة سوف يتم تنفيذها بشكل منفصل عند إستدعائها من خلال عملية أخرى في النظام
وستعمل في موجه أوامر منفصل عن اللذي قمت بتشغيل عليه 
runserver
"""
@app.task
def add(x, y):
    return x + y

و الأن تشغيل the Celery worker server:

في موجه أوامر منفصل لا تقم بإغلاقه سيتم تشغيل app.task عليه أكتب الأمر التالي:

$ celery -A tasks worker --loglevel=INFO

لأستدعاء الأمر في أي مكان من المشروع ما عليك سوى فعل التالي:

 

from tasks import add
add.delay(4, 4) 

تمت معالجة المهمة الآن بواسطة موجه الأوامر الذي بدأته سابقًا. يمكنك التحقق من ذلك من خلال النظر في مخرجات في موجه الأوامر.

يمكنك معرفة المزيد من خلال documentation الخاص ب celery.
وبما أنك تريد ضغط ملفات يمكنك وضع عميلة الضغط ك task و تفعيله داخل celery حتى لا تجعل الموقع بطئ.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...