在外部python scrip中使用Django模型

2024-04-25 18:17:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我今天很困惑。

我试图在python脚本中使用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

在检查时,我创建了一个名为creds的文件,其中包括

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

从creds文件所在的终端窗口,我知道

source creds

从django-admin.py shell中,我可以导入任何django应用程序模型,而不会出现任何错误。

为什么它在我的python脚本中不起作用?

我已经完成了Django,我需要做的是创建一个python守护进程脚本,该脚本将访问我的Django应用程序模型。

我在Ubuntu12.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所在的目录位于my sys.path中,但是,它仍然无法导入openstack_dashboard.settings。

谢谢大家。


Tags: pathdjangoimport脚本openstacksettingsosvar
3条回答

这对我有效:

from django.conf import settings
import myfolder.settings as app_settings

settings.configure(INSTALLED_APPS=app_settings.INSTALLED_APPS,DATABASES=app_settings.DATABASES)

import django
django.setup()

from myapp123.models import Sample
for s in Sample.objects.all():
    print(s)

如果项目的布局(以及设置文件的路径)如下所示,则下面的脚本应该可以工作:

/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项目,horizonopenstack_dashboard位于同一目录级别。您要做的是将sys.path设置为更高的级别:

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

你需要写一个custom management command,而不是做这些奇怪的杂技。

创建名为management的模块(换句话说,创建一个目录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()))

保存文件后,您就可以执行python manage.py my_command,它将可以访问您的所有模型和设置。

如果需要将其作为守护进程运行,Daniel Roseman编写了^{}来完成这项工作。安装后:

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.

相关问题 更多 >