2016-01-04 8 views
7

मैं क्या हासिल करना चाहते हैं:बाहरी पायथन लिपि द्वारा Django खोल में कोड निष्पादित करने के लिए कैसे?

मैं CLI से डेटाबेस में Django उन निष्क्रिय करने के लिए एक अजगर स्क्रिप्ट बनाने के लिए करना चाहते हैं। मैं इसके साथ आया:

$ sudo python manage.py shell 
>>> user = User.objects.get(username=FooBar) 
>>> user.is_active = False 
>>> user.save() 
>>> exit() 

उपरोक्त कोड काम करता है जब मैं मैन्युअल रूप से मैन्युअल आदेश कमांड के बाद दर्ज करता हूं। हालांकि, मैं

$ sudo python script.py 

अब मैं कोशिश की है diffirent की तरह एक .py लिपि में आदेश पर अमल कर दिया चाहते हैं aproaches:

  • os.system("command1 && command2 && command3")
  • subprocess.Popen("command1 && command2 && command3", stdout=subprocess.PIPE, shell=True)

समस्या:

यह काम नहीं करता है! मुझे लगता है कि यह समस्या यहां है क्योंकि पाइथन खोले गए Django खोल (पहले कमांड) खत्म होने तक प्रतीक्षा करता है जो कभी नहीं होता है। यह स्क्रिप्ट में शेष आदेशों को निष्पादित नहीं करता है क्योंकि पहला कमांड इसे होल्ड में रखता है।

subprocess.popen शैल में कमांड निष्पादित कर सकता है लेकिन केवल पायथन शेल में, मैं Django खोल का उपयोग करना चाहता हूं।

कोई भी विचार कस्टम कोड निष्पादन के लिए एक .py स्क्रिप्ट के साथ Django खोल को कैसे पहुंचा सकता है?

+0

कैसे के बारे में 'अजगर manage.py खोल चलाने falsetru

उत्तर

8

सबसे पहले, आपको sudo के साथ अपने अजगर खोल नहीं तक पहुँचने की जानी चाहिए। जड़ के रूप में चलाने की जरूरत नहीं है।

दूसरा, कमांड प्रॉम्प्ट से चलने वाली एक स्क्रिप्ट बनाने का तरीका कस्टम manage.py स्क्रिप्ट लिखना है, ताकि आप ./manage.py deactivate_users चला सकें। ऐसा करने के लिए पूर्ण निर्देश the documentation में हैं।

3

इनपुट करने के लिए प्रयास करें यहां दस्तावेज़ के रूप में चल रहा है Django-खोल को आदेश:

$ sudo python manage.py shell << EOF 
user = User.objects.get(username=FooBar) 
user.is_active = False 
user.save() 
exit() 
EOF 
2

आप Python स्क्रिप्ट है जो Django मॉडल तक पहुँचता है निष्पादित करने के लिए चाहते हैं, तो आपको पहले एक वातावरण चर निर्धारित करने की आवश्यकता:

import os 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "<path>.settings") 

जो में आप अपनी परियोजना निर्देशिका द्वारा <path> प्रतिस्थापित करने की आवश्यकता है, जो होता है फ़ाइल settings.py

फिर अपने मॉडल फ़ाइलें आयात कर सकते, उदाहरण के लिए:

from <path>.models import User 
user = User.objects.get(username=FooBar) 
user.is_active = False 
user.save() 
0

इस सूत्र मैं एक सरल स्क्रिप्ट बनाने के बाद में पहले डेनियल ने टिप्पणी के आधार पर काम किया जाना। मैं इसे इस धागे के पाठकों के लिए साझा कर रहा हूं जो एक ही लक्ष्य को प्राप्त करने की कोशिश कर रहे हैं। यह स्क्रिप्ट एक काम करेगा "manage.py निष्क्रियivate_user" फ़ंक्शन।

यह आपके Django अनुप्रयोग फ़ोल्डर संरचना का एक उदाहरण संदर्भ है:

Django folder structure

आप "deactivate_user.py" फ़ाइल बनाएं और प्रबंधन/आदेशों/deactivate_user.py निर्देशिका में यह जगह करना चाहते हैं।

from django.core.management.base import BaseCommand, CommandError 
from django.contrib.auth.models import User 

class Command(BaseCommand): 
    help = 'Deactivate user in the database' 

    def handle(self, *args, **options): 
     username = raw_input('Please type the username of the user you want remove: ') 
     try: 
      user = User.objects.get(username=username) 
      user.is_active = False 
      user.save() 
      print ('User is now deactivated in the database.') 
     except User.DoesNotExist: 
      print ('Username not found') 

कॉल "अजगर manage.py deactivate_user" का उपयोग करके स्क्रिप्ट तुम भी एक ही कोड के साथ एक "activate_user" स्क्रिप्ट बना सकते हैं लेकिन user.is_active = झूठी उपयोग = सच के बजाय।

0

ओपन Django शैल python manage.py shell

फिर execfile('filename.py')

संबंधित मुद्दे