如何在我的Django项目中执行任意脚本?
有时候我想在我的Django项目中执行一个文件,就像在命令行中那样,但又希望能像使用文本编辑器一样方便。这主要是为了试验一些东西,或者在把功能放到视图、测试、定时任务或管理命令之前,快速做个原型。
我知道可以在我的.py文件顶部加上几行代码,这样它就会在Django环境中运行:
import sys
sys.path.append('/location/of/projet')
from django.core.management import setup_environ
import settings
setup_environ(settings)
我觉得做一个管理命令会更简单,这个命令可以接受一个参数,也就是要运行的Python模块,并在Django环境中执行它。下面是我写的'runmodule'命令:
from django.core.management.base import BaseCommand, CommandError
class Command(BaseCommand):
help = "Runs an arbitrary module, in the Django environment, for quick prototyping of code that's too big for the shell."
def handle(self, *args, **options):
if not args:
return
module_name = args[0]
try:
__import__(module_name)
except ImportError:
print("Unable to import module %s. Check that is within Django's PYTHONPATH" % (module_name))
看起来这个方法有效——我可以把一些代码放在一个模块里,然后把它作为参数传给这个命令,它就会被执行,比如:
python manage.py runmodule myapp.trysomethingout
这将执行myapp/trysomethingout.py。这样做是最好的方法吗?
3 个回答
2
这是最简单的解决办法:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
import django
django.setup()
记得把这个放在你Python文件的最上面,在导入任何模型之前。
另外,你也可以使用@beyondfloatingpoint提到的解决方案:
import os, sys
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
sys.path.append("mysite")
os.chdir("mysite")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
9
要正确执行一个脚本并让它能使用django的环境,最好的办法是把 DJANGO_SETTINGS_MODULE
这个环境变量设置为你的设置模块(如果需要的话,也要设置合适的 PYTHONPATH
)。在Windows系统上,这通常意味着你需要执行:
set DJANGO_SETTINGS_MODULE=setting
在bash中,你可以这样做:
export DJANGO_SETTINGS_MODULE=setting
现在你可以导入你的模型等等了。
详细信息可以查看: https://docs.djangoproject.com/en/dev/topics/settings/#designating-the-settings。
需要注意的是,要导入 settings
模块,你应该使用 from django.conf import settings
。这样做是为了考虑到 DJANGO_SETTINGS_MODULE
的设置,而不是自动使用 settings.py。