Django 1.6独立脚本在Django环境中运行失败
我有一个独立的脚本,需要在Django环境中运行。这个脚本使用了数据库的ORM(对象关系映射)等功能。当我尝试运行它时,出现了一个错误,提示 from .generators import thread_generator
。所以,很明显这个脚本不在Django环境里。我在网上查了很多资料,尝试了各种方法,但还是没有成功。目前,我尝试了下面的方式,但依然没有效果。我甚至不确定 bot_server.local
是否正确,或者应该用 bot_server.settings
。不过,我确实在设置中使用了 local.py
。我不能把它当作命令来运行,因为我需要它作为一个独立的脚本来使用。我希望这个设置能在脚本内部永久生效,而不是依赖临时的环境变量。
from functools import wraps
import sys
import os
import datetime
import base64
import json
from django.db import connection
from django.core.management.base import BaseCommand, CommandError
from .generators import thread_generator
from .do_request import do_request
from .models import Employee, ThreadVault
if __name__ == '__main__':
os.environ['DJANGO_SETTINGS_MODULE'] = "bot_server.local"
sys.path.append("/home/git/bot_server/bot_server")
3 个回答
1
是的,这个答案说得很简单。
下面是一个manage.py文件的示例:
#!/usr/bin/env python
from settings.common import PROJECT_ROOT
import os
import sys
os.chdir(PROJECT_ROOT)
sys.path.insert(0, os.path.abspath(os.path.join(PROJECT_ROOT, "..")))
for i, arg in enumerate(sys.argv):
if arg.startswith("--site"):
os.environ["MEZZANINE_SITE_ID"] = arg.split("=")[1]
sys.argv.pop(i)
if __name__ == "__main__":
settings_module = "settings.common"
os.environ.setdefault("DJANGO_SETTINGS_MODULE", settings_module)
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
2
这个答案其实很简单……只需要把manage.py里的内容粘贴过来就行:
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "bot_server.settings.local")
from django.core.management import execute_from_command_line
我看了这么多帖子,真不敢相信之前居然没有人提到过这个。
3
要运行一个独立的脚本,你只需要在开始你的脚本之前写下这段代码。独立脚本执行时遇到的问题是它找不到Django的环境,所以为了让它找到这个环境,我们需要添加设置文件。
//Start your code here
import os, sys
from os import path
proj_path = "project_path\project_name"
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project_name.settings")
sys.path.append(proj_path)
os.chdir(proj_path)
from django.core.wsgi import get_wsgi_application
from app1.models import *
from app2.models import model_name
from app3.models import model_name1, model_name2
application = get_wsgi_application()
//Start your script from here