12

今天我很困惑。

我试图在我的 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-daemon 脚本来访问我的 django 应用程序模型。

我正在使用具有 django 1.5 的 Ubuntu 12.04

当我寻找解决方案时,我这样做了:

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。

感谢大家。

4

4 回答 4

30

您需要编写自定义管理命令,而不是做这些奇怪的杂技。

在您列出的任何应用程序的目录中创建一个名为 management 的模块(换句话说,创建一个目录management并在其中创建一个空文件) 。因此,如果您有,您将创建:__init__.pyINSTALLED_APPSmyapp

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

从 github 自述文件中完成后:

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.
于 2013-10-20T12:09:25.507 回答
9

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

/var/www/cloudloon/horizo​​n/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")
于 2013-10-20T10:00:27.003 回答
4

这对我有用:

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)
于 2019-03-12T11:04:04.277 回答
1

我的解决方案(灵感来自http://blog.gabrielsaldana.org/using-django-models-in-external-python-scripts/):

import os
import sys
sys.path.append( os.path.join(os.path.dirname(__file__), 'MyDjangoProject'))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "MyDjangoProject.settings")
import django
from django.conf import settings
django.setup()

from myapp.models import MyModel
for s in MyModel.objects.all():
    print(s) 
于 2021-05-13T15:10:30.053 回答