2013-10-20 7 views
10

मैं आज बहुत उलझन में था।बाहरी पायथन लिपि में डीजेंगो मॉडल का उपयोग

मैं अपनी पायथन लिपि में अपने django ऐप मॉडल का उपयोग करने की कोशिश कर रहा था।

यहां मेरे दृष्टिकोण

import os, sys 

sys.path.append("/var/www/cloudloon/horizon") 
os.environ["DJANGO_SETTINGS_MODULE"] = "openstack_dashboard.settings" 
from django.contrib.auth.models import User 

मैं उलझन में क्यों अपनी मुझे

ImportError: Could not import settings 'openstack_dashboard.settings' (Is it on sys.path?): cannot import name auth 

देने की जाँच करने पर था मुझे लगता है कि

export PYTHONPATH=$PYTHONPATH:/var/www/cloudloon/horizon/; 
export DJANGO_SETTINGS_MODULE=openstack_dashboard.settings; django-admin.py shell; 

और टर्मिनल विंडो से शामिल creds बुलाया आ फ़ाइल बनाई है जहां क्रेडिट फ़ाइल स्थित है, मैं

करता हूं
source creds 

और उस django-admin.py खोल से, मैं किसी भी त्रुटि के बिना अपने किसी भी django ऐप मॉडल आयात कर सकता था।

यह मेरी पायथन लिपि में क्यों काम नहीं करता है?

मैं Django के साथ किया गया है, मुझे एक पायथन-डेमॉन स्क्रिप्ट बनाने के लिए क्या करना है जो मेरे django ऐप मॉडल तक पहुंच जाएगा।

मैं Ubuntu 12.04 में Django 1.5

मैं समाधान की तलाश के रूप में है कि के साथ काम कर रहा हूँ, मैंने किया था यह:

import os, sys 

sys.path.append("/var/www/cloudloon/horizon") 
sys.path.append("/var/www/cloudloon/horizon/openstack_dashboard") 
# os.environ["DJANGO_SETTINGS_MODULE"] = "settings" 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", 
          "openstack_dashboard.settings") 

print os.environ["DJANGO_SETTINGS_MODULE"] 
for s in sys.path: 
    print s 

from django.contrib.auth.models import User 

यहाँ उत्पादन: http://paste.openstack.org/show/48787/

के रूप में आप देख सकते हैं, निर्देशिका जहां settings.py स्थित है मेरे sys.path पर मौजूद है, हालांकि, यह अभी भी openstack_dashboard.settings आयात करने में असमर्थ था।

सभी को धन्यवाद।

उत्तर

8

नीचे स्क्रिप्ट प्रदान की काम करना चाहिए कि अपनी परियोजना के लेआउट (और अपनी सेटिंग्स फ़ाइल का पथ) इस तरह दिखता है:

/var/www/cloudloon/horizon/openstack_dashboard/settings.py

#!/usr/bin/env python 
import os, sys 

sys.path.append("/var/www/cloudloon/horizon") 
os.environ["DJANGO_SETTINGS_MODULE"] = "openstack_dashboard.settings" 
from django.contrib.auth.models import User 

मेरा मानना ​​है कि समस्या आप देख रहे हैं की वजह से है आपकी प्रोजेक्ट की व्यवस्था, या आपको स्क्रिप्ट में sys.path कॉल पर एक और निर्देशिका स्तर जोड़ने की आवश्यकता है।

संपादित करें:

अपने GitHub परियोजना, horizon और openstack_dashboard को देखते हुए एक ही निर्देशिका स्तर पर कर रहे हैं। क्या आप क्या करना चाहते हैं कि हम आपकी sys.path एक करने के लिए स्तर उच्च सेट है:

sys.path.append("/var/www/cloudloon") 
+0

प्रबंधन कमांड मैं क्या बनाने के लिए कोशिश कर रहा हूँ के लिए एक अच्छा विचार नहीं है। मुझे पायथन-डेमॉन स्क्रिप्ट बनाने की ज़रूरत है। असल में, पायथन-डेमॉन स्क्रिप्ट चलाने के लिए, मुझे "पायथन myscript.py रन" चलाने की आवश्यकता है। पायथन प्रबंधन कमांड इसके लिए अच्छा नहीं है। –

+0

उपरोक्त आपके कोड का उपयोग करके, यह मुझे विशेषता देता है: 'str' ऑब्जेक्ट में कोई विशेषता नहीं है '__file__' –

+0

@DjangoBot क्षमा करें, setup_en वातावरण एक मॉड्यूल ऑब्जेक्ट लेता है, स्ट्रिंग नहीं। मैंने कोड स्निपेट को सही किया है। –

23

इसके बजाय आप इन अजीब कलाबाजी करने का, एक custom management command लिखने के लिए की जरूरत है।

एक मॉड्यूल बुलाया प्रबंधन बनाएं (दूसरे शब्दों में, एक निर्देशिका management बना सकते हैं और इसके अंदर एक खाली __init__.py फ़ाइल बनाने) आप INSTALLED_APPS में सूचीबद्ध किया है किसी भी एप्लिकेशन की निर्देशिका के अंदर।तो अगर आप myapp है, तो आप बना सकते हैं:

myapp 
| 
> management 
| | __init__.py 
> models.py 
> views.py 

तब प्रबंधन निर्देशिका में, एक और मॉड्यूल commands बनाने और इसे में एक फ़ाइल जो आपके आदेश का नाम है बनाने; उदाहरण my_command.py के लिए, इस तरह:

myapp 
| 
> management 
| | __init__.py 
| | commands 
| | | __init__.py 
| | | my_command.py 
> models.py 
> views.py 

my_command.py में, इस बॉयलरप्लेट कोड लिखें:

from django.core.management.base import BaseCommand, CommandError 
from myapp.models import MyModel 

class Command(BaseCommand): 
    help = 'Does some magical work' 

    def handle(self, *args, **options): 
     """ Do your work here """ 
     self.stdout.write('There are {} things!'.format(MyModel.objects.count())) 

एक बार जब आप फ़ाइल को सहेजने के लिए, आप ऐसा करने में सक्षम हो जाएगा और यह सब के लिए उपयोग होगा आपके मॉडल और सेटिंग्स।

यदि आपको इसे डेमन के रूप में चलाने की आवश्यकता है, तो Daniel Roseman ने django-initd लिखा जो वास्तव में ऐसा करता है। एक बार जब आप यह स्थापित किया है:

from django.core.management.base import CommandError 
from daemon_command import DaemonCommand 
from myapp.models import MyModel 

class Command(DaemonCommand): 
    help = 'Does some magical work' 

    def loop_callback(self, *args, **options): 
     """ Do your work here """ 
     self.stdout.write('There are {} things!'.format(MyModel.objects.count())) 

एक बार जब आप किया है कि from the github readme:

The important parts of such a process are these: 

    * it comes up automatically on server startup 
    * it logs errors and information to a named location, which is configurable 
    * if the process dies, it restarts itself straight away 

[...] 

Run the command as normal, but pass one of --start, --stop or --restart to 
work as a daemon. Otherwise, the command will run as a standard application. 
+0

मेरे पास यह पहले एक जवाब के रूप में था, लेकिन स्क्रिप्ट को एक बार ऑफम कमांड नहीं माना जाता है। –

+0

पायथन-डेमॉन के साथ कार्यान्वित करना बहुत मुश्किल लगता है। –

+0

अच्छा जवाब, django-initd के बारे में पता नहीं था। इस तरह ओपी को यह करना चाहिए, लेकिन मुझे लगता है कि ओपी के पास पथ मुद्दे हैं। –

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