在外部python脚本中使用Django模型

在外部python脚本中使用Django模型,python,django,Python,Django,我今天很困惑 我试图在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

我今天很困惑

我试图在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应用程序模型

我在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
以下是输出:

如您所见,settings.py所在的目录位于my sys.path上,但它仍然无法导入openstack_dashboard.settings


谢谢大家。

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

myapp
 |
 > management
 | | __init__.py
 | | commands
 | | | __init__.py
 | | | my_command.py
 > models.py
 > views.py
/var/www/cloudloon/horizon/openstack_dashboard/settings.py

我相信您看到的问题是由于项目的安排,或者您需要在脚本中的
sys.path
调用中附加另一个目录级别

编辑:

查看您的github项目,
horizon
openstack\u dashboard
位于同一目录级别。您要做的是将
sys.path
设置为更高一级:

sys.path.append("/var/www/cloudloon")
你需要写一篇文章,而不是做这些奇怪的杂技

已安装的应用程序
中列出的任何应用程序的目录中创建一个名为management的模块(换句话说,创建一个目录
management
,并在其中创建一个空的
\uu init\uuuuuuuuuuupy
文件)。因此,如果您有
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_命令
,并且它将可以访问您的所有模型和设置

如果需要将其作为守护进程运行,请编写相应的程序。安装后:

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 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)
我的解决方案(灵感来源于):


对于我试图创建的内容,管理命令似乎不是一个好主意。我需要创建python守护进程脚本。基本上,要运行python守护进程脚本,我需要运行“pythonmyscript.pyrun”。Python管理命令不适合它。使用上面的代码,它会给我AttributeError:“str”对象没有属性“file”@DjangoBot抱歉,安装环境使用的是模块对象,而不是字符串。我已经更正了代码片段。自Django 1.4以来,setup_environ似乎已被弃用。弃用警告:“setup_environ”函数已弃用,您可能需要更新“manage.py”;请参阅Django 1.4发行说明()@DjangoBot我已经更新了我的答案,但它基本上只是说检查您的项目结构。我以前有过这个答案,但脚本应该是守护程序,而不是一次性命令。它似乎太难用python-daemon实现。答案不错,我不知道Django initd。OP应该这样做,但我认为OP有路径问题。一旦他使用管理命令,路径问题就会消失。这在Django 1.8上非常有效。(其他答案中建议的路径设置和导入技术均无效。)
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)
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)