ऐसा करने के लिए, आपको निम्न कार्य करना होगा। यदि आपको नहीं पता कि "विकल्प" और "तर्क" क्या हैं, तो optparse background पढ़ें।
प्रत्येक "कमांड" या "अनुरोध" वास्तव में एक मॉडल का एक उदाहरण है। अपने अनुरोध मॉडल को परिभाषित करने वाले सभी पैरामीटर के साथ परिभाषित करें।
सरल विकल्पों के लिए, आपको CHOICES की एक विशिष्ट सूची के साथ एक फ़ील्ड प्रदान करना होगा। कमांड लाइन में "चालू" या "ऑफ" (-x
) विकल्पों के लिए आपको दो मानव-समझने योग्य मानों ("एक्स एक्स" और "एक्स न करें" के साथ एक CHOICE सूची प्रदान करनी चाहिए।)
किसी मान वाले विकल्पों के लिए, आपको एक फ़ील्ड प्रदान करना होगा जो विकल्प का मान लेता है। आपको इस क्षेत्र के सत्यापन के साथ एक फॉर्म लिखना होगा। हम थोड़ा सा विकल्प मान सत्यापन पर वापस आ जाएंगे।
तर्क के लिए, आपके पास दूसरा मॉडल है (पहले एफके के साथ)। यह एक फ़ाइलपैथ फ़ील्ड जितना आसान हो सकता है, या अधिक जटिल हो सकता है। फिर, आपको इस मॉडल के उदाहरणों को प्रमाणित करने के लिए एक फॉर्म भी प्रदान करना पड़ सकता है।
विकल्प सत्यापन किस तरह का विकल्प बदलता है। आपको स्वीकार्य मानों को वर्णों के सबसे कम संभव सेट के रूप में सीमित करना होगा और एक पार्सर लिखना चाहिए जो केवल वैध वर्णों को पारित करने के बारे में पूरी तरह से सुनिश्चित है।
आपके विकल्प ऑप्टपरसे-स्ट्रिंग, int, long, choice, float और complex में विकल्प प्रकारों के समान श्रेणियों में आ जाएंगे। ध्यान दें कि int, long, float और complex में पहले से ही Django के मॉडल और प्रपत्रों द्वारा परिभाषित सत्यापन नियम हैं। चॉइस एक विशेष प्रकार की स्ट्रिंग है, जो पहले ही डीजेगो के मॉडल और फॉर्म द्वारा समर्थित है।
"स्ट्रिंग्स" क्या बचा है। अनुमत तारों को परिभाषित करें। उन तारों के लिए एक regex लिखें। रेगेक्स का उपयोग करके मान्य करें। अधिकांश समय, आप कभी भी किसी भी रूप में उद्धरण ("
, '
या `) स्वीकार नहीं कर सकते हैं।
अंतिम चरण। आपके मॉडल में एक विधि है जो आदेश को subprocess.Popen
के लिए तैयार स्ट्रिंग के अनुक्रम के रूप में उत्सर्जित करती है।
संपादित
यह हमारे app की रीढ़ है। यह बहुत आम है, हमारे पास एक ही मॉडल है जिसमें कई फॉर्म हैं, प्रत्येक एक विशेष बैच कमांड के लिए जो रन हो जाता है। मॉडल बहुत सामान्य है। मॉडल ऑब्जेक्ट बनाने के लिए फॉर्म बहुत विशिष्ट तरीके हैं। इस तरह Django को काम करने के लिए डिज़ाइन किया गया है, और यह Django के अच्छी तरह से विचार-विमर्श डिजाइन पैटर्न के साथ फिट करने में मदद करता है।
कोई भी क्षेत्र जो "खुले पाठ फ़ील्ड के रूप में उपलब्ध है" एक गलती है। "खुले" वाले प्रत्येक फ़ील्ड में निर्दिष्ट करने के लिए एक रेगेक्स होना चाहिए जो अनुमति है। यदि आप रेगेक्स को औपचारिक रूप से औपचारिक नहीं कर सकते हैं, तो आपको उस पर पुनर्विचार करना होगा जो आप कर रहे हैं।
एक फ़ील्ड जिसे रेगेक्स के साथ बाध्य नहीं किया जा सकता है बिल्कुल कमांड लाइन पैरामीटर नहीं हो सकता है। अवधि। इसे इस्तेमाल होने से पहले फ़ाइल कॉलम में फ़ाइल में संग्रहीत किया जाना चाहिए।
संपादित
इस तरह।
class MySubprocessCommandClass(models.Model):
myOption_1 = models.CharField(choice = OPTION_1_CHOICES, max_length=2)
myOption_2 = models.CharField(max_length=20)
etc.
def theCommand(self):
return [ "theCommand", "-p", self.myOption_1, "-r", self.myOption_2, etc. ]
आपका फॉर्म इस मॉडल के लिए मॉडलफॉर्म है।
आपको मॉडल के उदाहरण save()
नहीं है। हम उन्हें बचाते हैं ताकि हम ठीक से चलने वाले लॉग का एक लॉग बना सकें।
http://blog.littleimpact.de/index.php/2008/08/11/avoiding-shell-injection-in-ruby-python-and-php/ के माध्यम से पढ़ना ऐसा लगता है कि मैं ठीक हूँ शेल = गलत के रूप में लंबे, जो डिफ़ॉल्ट है। (वह है, एक, और केवल एक आदेश चलाया जाएगा।) क्या यह भी आप क्या कह रहे हैं? – gotgenes
हां, यही वह है जो मैं कह रहा हूं। –