2013-10-20 22 views
10

Bugün kafam çok karıştı.Dış python komut dosyasında Django modellerini kullanma

Django uygulama modellerimi python betiğimde kullanmaya çalışıyordum. Burada

yaklaşımım

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 

neden onun kontrol üzerine bana

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

veren karışıktı ben

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

ve terminal penceresinden içeren creds denilen aa dosya oluşturdum olduğunu Kredi dosyasının bulunduğu yer,

ve bu django-admin.py kabuğundan, django uygulama modellerimden herhangi birini hata olmadan alabilirim.

Neden python kodumda çalışmıyor?

Django ile işim bitti, yapmanız gereken şey django uygulama modellerime erişecek bir python-daemon komut dosyası oluşturmak.

Django ı çözümler arıyor gibi 1.5

sahip olduğunu Ubuntu 12.04 yılında ile çalışıyorum, ben yaptım bu:

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 

heres çıkışı: http://paste.openstack.org/show/48787/

gördüğünüz gibi, settings.py'nin bulunduğu dizinin sys.path'ımda bulunması, yine de, openstack_dashboard.settings dosyasını içe aktaramadı.

Herkese teşekkürler.

cevap

8

aşağıda komut projenizin düzeni (ve ayarlarınız dosyasının yolunu) şöyle şartıyla çalışması gerekir:

/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 

Ben karşılaştığınız soruna bağlı olduğuna inanıyoruz projenizin düzenlenmesi veya komut dosyasında sys.path çağrısına başka bir dizin düzeyi eklemeniz gerekir.

Düzenleme: github proje, horizon ve openstack_dashboard baktığımızda

aynı dizin seviyesinde bulunmaktadır. Ne yapmak istediğimiz sizin sys.path bire düzeyi yüksek ayarlanır:

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

yönetim komutu ı oluşturmaya çalışıyorum ne için iyi bir fikir değil gibi görünüyor. Python-daemon script'i oluşturmam gerekiyor. Temel olarak, python-daemon komut dosyasını çalıştırmak için "python myscript.py run" komutunu çalıştırmam gerekiyor. Python yönetim komutu bunun için iyi değil. –

+0

Yukarıdaki kodunuzu kullanarak, Bana AttributeError verir: 'str' nesnesinin '__file__' özniteliği yok ' –

+0

@DjangoBot üzgünüz, setup_environ bir dize değil bir modül nesnesi alır. Kod snippet'ini düzelttim. –

23

yerine bu garip akrobatik yapmanın, bir custom management command yazmak gerekir.

(diğer bir deyişle, bir dizin management oluşturmak ve içindeki boş __init__.py dosyası oluşturmak) bir modül denilen yönetimini oluşturun INSTALLED_APPS listelenen herhangi app dizini içine.Yönetim dizinde Sonra

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

başka modül commands yaratıp içerisinde komutadan adıdır bir dosya oluşturmak;: Eğer myapp varsa Yani, yaratacak Örneğin my_command.py için böyle:

my_command.py yılında
myapp 
| 
> management 
| | __init__.py 
| | commands 
| | | __init__.py 
| | | my_command.py 
> models.py 
> views.py 

, bu klişe kodu yazmak: Dosyayı kaydettikten sonra

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())) 

, sen yapmak mümkün olacak ve tüm erişimi olacak Modelleriniz ve ayarlarınız.

Bunu bir arka plan programı olarak çalıştırmanız gerekirse, Daniel Roseman, tam olarak bunu yapan django-initd yazdı. Bunu yükledikten sonra:

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())) 

bunu from the github readme yaptıktan sonra:

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

Bunu daha önce bir cevap olarak görmüştüm, ama betiğin bir defalık değil, bir defalık olması gerekiyordu. –

+0

Python-daemon ile uygulamak çok zor görünüyor. –

+0

Güzel cevap, django-initd hakkında bilmiyordum. OP'nin böyle yapması gerektiği gibi, ama OP'nin yol sorunları olduğunu düşünüyorum. –

İlgili konular