12

有时我想在我的 Django 项目的上下文中执行一个文件,就像我在使用 shell 一样,但使用文本编辑器很方便。这主要是在将其放入视图、测试、重复任务或管理命令之前尝试一些东西,或者快速原型化一些功能。

我知道我可以将这些行放在 .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。这是最好的方法吗?

4

3 回答 3

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 。

于 2011-06-12T11:07:58.537 回答
1

这是最简单的解决方案:

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()
于 2020-11-12T15:08:10.553 回答
0

本文提供了最佳解决方案。

提示:确保您使用的是设置模块的正确路径,就我而言,我错过了以相同方式命名的嵌套目录。避免我的错误的最好方法是使用类似这个模板的东西开始。

于 2019-07-03T14:47:56.437 回答