【问题标题】:How do I execute an arbitrary script in the context of my Django project?如何在我的 Django 项目的上下文中执行任意脚本?
【发布时间】:2011-09-13 04:37:46
【问题描述】:

有时我想在我的 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。这是最好的方法吗?

【问题讨论】:

    标签: python django django-testing django-command-extensions


    【解决方案1】:

    使用正确的 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 。

    【讨论】:

    • 你可以将它直接放在你的 python 脚本上 if name == "main": 使用这一行:os.environ.setdefault ("DJANGO_SETTINGS_MODULE", "设置")
    【解决方案2】:

    this 文章中提供了最佳解决方案。

    提示:确保您使用的是设置模块的正确路径,在我的情况下,我错过了以相同方式命名的嵌套目录。避免我的错误的最好方法是使用类似this 的模板来开始。

    【讨论】:

      【解决方案3】:

      这是最简单的解决方案:

      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()
      

      【讨论】:

        猜你喜欢
        • 2018-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-07
        • 1970-01-01
        • 2020-09-13
        • 1970-01-01
        相关资源
        最近更新 更多