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

Dja*_*Bot 11 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
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么它给我

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

检查后,我创建了一个名为creds的文件,其中包含

export PYTHONPATH=$PYTHONPATH:/var/www/cloudloon/horizon/; 
export DJANGO_SETTINGS_MODULE=openstack_dashboard.settings; django-admin.py shell;
Run Code Online (Sandbox Code Playgroud)

从信用档案所在的终端窗口,我做

source creds
Run Code Online (Sandbox Code Playgroud)

从那个django-admin.py shell,我可以导入任何我的django应用程序模型,没有任何错误.

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

我完成了Django,我需要做的是创建一个python-daemon脚本来访问我的django app模型.

我正在使用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
Run Code Online (Sandbox Code Playgroud)

继承人的产出:http://paste.openstack.org/show/48787/

正如您所看到的,settings.py所在的目录存在于我的sys.path中,但是,它仍然无法导入openstack_dashboard.settings.

感谢大家.

Bur*_*lid 27

你需要编写一个自定义管理命令,而不是做这些奇怪的杂技.

在您列出的任何应用程序的目录中创建一个名为management 的模块(换句话说,创建一个目录management并在其中创建一个空__init__.py文件)INSTALLED_APPS.所以,如果你有myapp,你会创建:

myapp
 |
 > management
 | | __init__.py
 > models.py
 > views.py
Run Code Online (Sandbox Code Playgroud)

然后在管理目录中创建另一个模块,commands并在其中创建一个文件,该文件是您的命令的名称; 例如my_command.py,像这样:

myapp
 |
 > management
 | | __init__.py
 | | commands
 | | | __init__.py
 | | | my_command.py
 > models.py
 > views.py
Run Code Online (Sandbox Code Playgroud)

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()))
Run Code Online (Sandbox Code Playgroud)

保存文件后,您将能够执行此操作python manage.py my_command,并且可以访问所有模型和设置.

如果你需要将它作为一个守护进程运行,丹尼尔罗斯曼写道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()))
Run Code Online (Sandbox Code Playgroud)

一旦你完成了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.
Run Code Online (Sandbox Code Playgroud)


Jos*_*ton 8

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

/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
Run Code Online (Sandbox Code Playgroud)

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

编辑:

查看您的github项目,horizon并且openstack_dashboard位于相同的目录级别.你想要做的是将你的设置sys.path提高一级:

sys.path.append("/var/www/cloudloon")
Run Code Online (Sandbox Code Playgroud)


小智 5

这对我有用:

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)
Run Code Online (Sandbox Code Playgroud)