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

تنفيذ كود معين عندما يبدأ جانغو Django لأول مرة فقط

Amer Abdallah

السؤال

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

كيف أقوم بهذا الأمر في جانغو Django؟

أنا أستخدم الإصدار 1.7 من جانغو Django

تم التعديل في بواسطة Amer Abdallah
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

كما ذكر سامح.. من أجل Django 1.7+ يجب عليك استخدام الخطاف. ولكن إذا كنت تريد أن يتم استدعاء دالتك فقط عند تشغيل الخادم (وليس عند إجراء migrations ، migrate ، shell ، إلخ.. ) ، وتريد تجنب استثناءات AppRegistryNotReady عليك القيام بما يلي:

# الملف: myapp / apps.py
import sys
from django.apps import AppConfig
class AppC(AppConfig):
    name = 'App'
    def ready(self):
        if 'runserver' not in sys.argv:
            return True
        # يجب عليك استيراد الوحدات الخاصة بك هنا
        # لتجنب استثناء AppRegistryNotReady
        from .models import MyModel 
        # كود بدء التشغيل 

أيضاً يمكنك استخدام <project> /wsgi.py للقيام بذلك ، وسيتم تشغيله مرة واحدة فقط ، عند بدء تشغيل الخادم ، ولكن ليس عند تشغيل أوامر أو استيراد وحدة معينة:

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")
# كود بدء التشغيل هنا
..
..
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
تم التعديل في بواسطة Ali Haidar Ahmad
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

لا يجب أن تستخدم Middleware لشيء سوف يتم تشغيله لمرة واحدة. فيمكنك أن تستخدم خطاف hook للقيام بهذا الأمر.

للقيام بهذا الأمر في جانغو Django الإصدار 1.7 أو أحدث:

أولًا في الملف myapp/apps.py، استخدم الكود التالي:

from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name = 'myapp'
    verbose_name = "My Application"
    def ready(self):
        pass # اكتب هنا الكود الذي تريد تنفيذه عند تشغيل الخادم

ثانيًا في الملف myapp/__init__.py يجب أن تخبر جانغو Django بأن ينفذ هذا الكود:

default_app_config = 'myapp.apps.MyAppConfig'	# MyAppConfig يحب أن تكون بنفس اسم الدالة السابقة

أما إن كنت تستخدم جانغو Django الإصدار أققل من 1.7، فيمكنك أت تتبع الخطوات التالية:

ضع الكود الخاص بك في أي ملف init.py خاص بالتطيقات المثبته INSTALLED_APPS، على سبيل المثال الملف myapp/__ init__.py

def startup():
    pass # اكتب هنا الكود الذي تريد تنفيذه عند تشغيل الخادم

startup()

عند تشغيل الخادم من خلال الأمر التالي:

./manage.py runserver

يتم تنفيذ هذا الكود مرتين، ولكن هذا لأن runserver يقوم بلتحقق من صحة النماذج أولاً ولحل هذه المشكلة يمكنك تمرير العلم flag الذي --noreload، كالتالي:

python manage.py runserver --noreload

بهذه الطريقة سوف يتم تنفيذ الكود مرة واحدة فقط.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

أنت لا تحتاج الى برمجيات وسيطة "middleware" لتنفيذه لمرة واحدة, تريد تنفيذ التعليمات البرمجية في العناوين ذات المستوى الأعلى الموجودة في الملف urls.py. يتم استيراد هذه الوحدة وتنفيذها مرة واحدة, في ملف urls.py

from django.confs.urls.defaults import *
from my_app import one_time_startup

urlpatterns = ...

one_time_startup()

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...