إنشاء أوامر الإدارة في Django

أوامر الإدارة - يتم تنفيذ الأوامر من سطر الأوامر باستخدام البرنامج النصي Manage.py.

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

الأساسيات


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

app/ __init__.py management/ __init__.py commands/ __init__.py _tools.py zen.py 

في هذا المثال ، سيكون الأمر zen متاحًا ، لكن _tools لن يكون متاحًا.

يتم إنشاء الأوامر عن طريق الوراثة من فئة django.core.management.base.BaseCommand. في أبسط الحالات ، يكفي إعادة كتابة وظيفة المقبض. سيتم تنفيذ هذا الأمر ، وستتم طباعة النتيجة التي أرجعها في وحدة التحكم.

 from django.core.management.base import BaseCommand class Command(BaseCommand): help = 'The Zen of Python' def handle(self, *args, **options): import this 

دعونا نحاول استدعاء أمرنا:

 python manage.py zen The Zen of Python, by Tim Peters Beautiful is better than ugly. ... 

سمة فئة التعليمات عبارة عن وصف يتم عرضه عند استدعاء أمر بمفتاح --help أو إذا تم إدخال الأمر بشكل غير صحيح.

 $ python manage.py zen --help usage: manage.py zen [-h] [--version] [-v {0,1,2,3}] [--settings SETTINGS] [--pythonpath PYTHONPATH] [--traceback] [--no-color] The Zen of Python optional arguments: -h, --help show this help message and exit --version show program's version number and exit -v {0,1,2,3}, --verbosity {0,1,2,3} Verbosity level; 0=minimal output, 1=normal output, 2=verbose output, 3=very verbose output --settings SETTINGS The Python path to a settings module, eg "myproject.settings.main". If this isn't provided, the DJANGO_SETTINGS_MODULE environment variable will be used. --pythonpath PYTHONPATH A directory to add to the Python path, eg "/home/djangoprojects/myproject". --traceback Raise on CommandError exceptions --no-color Don't colorize the command output. 

تحليل الحجج


كما نرى ، فإن فريقنا يأخذ بالفعل 7 حجج.

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

لنفترض أننا غير مرتاحين للمخرجات الطويلة لوظيفتنا ، ونريد فقط أن تتم طباعة Hello world باستخدام -s و --short keys:

 from django.core.management.base import BaseCommand class Command(BaseCommand): help = 'The Zen of Python' def handle(self, *args, **options): if options['short']: import __hello__ else: import this def add_arguments(self, parser): parser.add_argument( '-s', '--short', action='store_true', default=False, help='  ' ) 

سيطبع هذا الملف Hello world عند استدعاؤه باستخدام مفتاح التبديل -s.

 $ python manage.py zen -s Hello world... (coolwriter)$ python manage.py zen The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. ... 

دعونا نفحص بمزيد من التفصيل كيفية تحديد تحليل الحجج.

يتم تحليل المحلل اللغوي من argparse.ArgumentParser ، ويمكنك القراءة عن الوسيطات التي اتخذتها دالة add_argument في وثائق مكتبة الحجج في وثائق الثعبان. أهمها:

الاسم أو العلامات - الاسم أو قائمة الأسماء والعلامات. لدينا هذا "قصير" و "-s" و "قصير".
العمل - ما يجب القيام به مع قيمة الحجة. الخيارات الأكثر إثارة للاهتمام (ولكن ليس كلها) هي كما يلي:

متجر - حفظ كقيمة خيارنا. إذا تم إرسال العديد من أزواج القيمة الرئيسية ، فإن قيمة الأخيرة
store_const - حفظ القيمة الثابتة في مفتاح الاسم. يتم تمرير الثابت كوسيطة const لنفس دالة add_argument.

على سبيل المثال:

 parser.add_argument('my_option', action='store_const', const=1234) 

سيتم تمرير وظيفة المقبض في الخيارات "my_option": 1234

store_true ، store_false - حالات خاصة للخيار السابق. تخزين صحيح أم خطأ
إلحاق - سيتم إلحاق القيمة بنهاية القائمة
append_const هي نفس القيمة السابقة ، ولكن القيمة التي تم تمريرها إلى وسيطة const تُلحق (والتي يمكن أن تكون أي كائن)

نرجس هو عدد الحجج. القيم المحتملة: عدد صحيح ، "؟" - واحد أو القيمة الافتراضية من الوسيطة الافتراضية ، "*" - بقدر ما هو موجود ، وسيتوجهون إلى القائمة ، "+" - واحد على الأقل ، وإذا كان العديد - سيذهبون إلى القائمة ، argparse.REMAINDER - جميع الوسائط المتبقية من سطر الأوامر ستذهب . غير متوافق مع الإجراء = const

يرجى ملاحظة ما يلي: إذا كنت تستخدم هذه الوسيطة ، فسيتم تمرير قيمة خيارك من سطر الأوامر للتعامل معها كقائمة ، حتى إذا كان هناك عنصر واحد فقط. (في هذه الحالة ، يتم إرسال القيمة الافتراضية كما هي ، دون الإرسال إلى القائمة.)

الافتراضي هو القيمة الافتراضية .
نوع - يلقي الوسيطة إلى النوع المحدد.
اختيارات - تقييد الخيارات لقيمة الحجة. يتم تمرير قائمة القيم المحتملة إلى قيمة الخيارات.
المطلوب هو حجة مطلوبة.
مساعدة - وصف لما تفعله هذه الحجة.
dest - إذا كنت تريد حفظ الخيار الخاص بك تحت اسم مختلف ، يمكنك تحديد dest = 'my_new_name'. خلاف ذلك ، سيتم استخدام اسم الوسيطة.
سيتم بعد ذلك تمرير هذه الوسيطات إلى وظيفة المقبض كقاموس خيارات.

ولكن ماذا لو أردنا تمرير حجج غير مسماة للتعامل معها؟

في هذه الحالة ، تحتاج إلى تحديد في add_arguments استلام كل الوسائط غير المسماة في خيار args. على سبيل المثال ، إذا أردنا تمرير عدة أعداد صحيحة للأمر:

 def add_arguments(self, parser): parser.add_argument( nargs='+', type=int, dest = 'args' ) 

أمر تنفيذ


يتم تنفيذ الأمر بالترتيب التالي:

  1. أولاً ، يتم استدعاء الأسلوب run_from_argv (). تعمل هذه الطريقة على إنشاء محلل من خلال استدعاء create_parser ، ويضيف المحلل اللغوي الذي تم إنشاؤه الوسائط الافتراضية (من النوع no-color) ، ويستدعي أيضًا طريقة add_arguments ، وبالتالي إضافة جميع الخيارات التي أنشأناها.
  2. بعد ذلك ، يتم استدعاء وظيفة التنفيذ. تقوم هذه الوظيفة بإجراء عدة فحوصات ، ثم تقوم بتشغيل وظيفة المقبض. تتم طباعة نتيجة المقبض إلى الإخراج القياسي.

بالطبع ، يمكن تخصيص أي من هذه الوظائف. على سبيل المثال ، لنرسم الناتج الجميل لرسالة مساعدة متعددة الأسطر:

 from argparse import RawTextHelpFormatter def create_parser(self, prog_name, subcommand): parser = super(Command, self).create_parser(prog_name, subcommand) parser.formatter_class = RawTextHelpFormatter return parser 

ربما هذا هو كل ما هو مطلوب لكتابة أوامر الإدارة في معظم الحالات.

الخلاصة


لا تدعي المقالة أنها نظرة عامة كاملة على جميع الاحتمالات عند إنشاء أوامر الإدارة - تم وصفها في وثائق Django. يمكن للمهتمين اللجوء إلى
التوثيق .

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

وحدة Argparse

Source: https://habr.com/ru/post/ar415049/


All Articles