如何在我的Django项目中执行任意脚本?

12 投票
3 回答
6062 浏览
提问于 2025-04-16 19:23

有时候我想在我的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 个回答

0

最好的解决方案可以在 这篇文章 中找到。

提示:确保你使用的是正确的设置模块路径。在我的情况下,我错过了同名的嵌套目录。避免我犯的错误,最好的办法是使用类似于 这个 模板来开始。

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。

撰写回答