【问题标题】:How do I set the DJANGO_SETTINGS_MODULE env variable?如何设置 DJANGO_SETTINGS_MODULE 环境变量?
【发布时间】:2017-01-01 06:06:06
【问题描述】:

我正在尝试修复我在 django 应用程序中看到的不发送邮件的错误。请注意,该应用程序运行良好,只是邮件功能失败。我试图收集错误日志,但我无法提出与发送邮件相关的任何错误。所以,我做了一个例子来尝试强制错误。示例如下:

from django.core.mail import send_mail

send_mail('hi', 'hi', 'test@test.com', ['myname@yeah.com'], fail_silently=False)

当我运行上面的代码时,我得到以下错误:

Traceback (most recent call last):
  File "dmail.py", line 14, in <module>
    send_mail('hi', 'hi', 'test@test.com', ['myname@yeah.com'], fail_silently=False)
  File "/data/servers/calendar_1/lib/python2.7/site-packages/django/core/mail/__init__.py", line 59, in send_mail
    fail_silently=fail_silently)
  File "/data/servers/calendar_1/lib/python2.7/site-packages/django/core/mail/__init__.py", line 29, in get_connection
    path = backend or settings.EMAIL_BACKEND
  File "/data/servers/calendar_1/lib/python2.7/site-packages/django/utils/functional.py", line 184, in inner
    self._setup()
  File "/data/servers/calendar_1/lib/python2.7/site-packages/django/conf/__init__.py", line 39, in _setup
    raise ImportError("Settings cannot be imported, because environment variable %s is undefined." % ENVIRONMENT_VARIABLE)
ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.

我设法通过将代码更改为以下代码来修复我的测试示例:

from django.core.mail import send_mail

from django.conf import settings
settings.configure(TEMPLATE_DIRS=('/path_to_project',), DEBUG=False, TEMPLATE_DEBUG=False)

send_mail('hi', 'hi', 'test@test.com', ['myname@yeah.com'], fail_silently=False)

但是,当我尝试将这些设置添加到 send_mail.py 时,我仍然没有从我的实际应用程序中收到任何邮件。有人可以清楚地向我解释我如何设置 DJANGO_SETTINGS_MODULE 以便我的示例和我的应用程序都可以看到它吗?如果做不到这一点,有人可以告诉我如何在 django 中设置有意义的日志记录,以便我实际上在日志中看到与邮件相关的错误吗?任何提示或指导将不胜感激。

【问题讨论】:

    标签: python django python-2.7 email


    【解决方案1】:

    您使用的是 Mac 还是 Linux?然后只需export DJANGO_SETTINGS_MODULE="project_name.settings.your_settings_file" 确保如果您的设置文件位于文件夹中,则其中还有一个 __init__.py 文件。

    在 Windows 上,我相信等价于 SET DJANGO_SETTINGS_MODULE="project_name.settings.your_settings_file,但我可能会弄错。

    有关 django 日志记录,请参阅https://docs.djangoproject.com/en/1.10/topics/logging/

    【讨论】:

    • 我在 CentOS/Linux 上。我的应用程序称为 oats,设置文件称为 settings.py。所以......我试图: export DJANGO_SETTINGS_MODULE="oats.settings" 但它没有效果。测试应用程序没有接收到它。
    • 在您的第一个代码块中,您是从 Python 解释器还是 django shell 运行它?如果是 shell,请确保您的设置文件中有 TEMPLATE_DIRS=('/path_to_project',), DEBUG=False, TEMPLATE_DEBUG=False,然后使用选项 --settings=oats.settings 调用 shell。运行服务器时使用相同的 --settings 选项。
    • 我使用的是解释器,而不是 shell。我尝试设置日志记录和日志记录工作,但没有任何与邮件相关的内容出现。非常令人沮丧。
    【解决方案2】:

    不要从应用程序外部设置它。在您的wsgi 文件中为DJANGO_SETTINGS_MODULE 变量创建一个条目。每次启动服务器时,都会自动设置此变量。

    例如:

    import os
    os.environ['DJANGO_SETTINGS_MODULE'] = '<project_name>.settings'
    

    【讨论】:

    • 当然,听起来不错。你有一个例子吗? (用于条目)
    • 更新了答案
    • 我检查了我的 wsgi 文件,它已经有了:os.environ.setdefault("DJANGO_SETTINGS_MODULE", "oats.settings") 我会尝试不使用 setdefault。
    • 我尝试添加 os.environ['DJANGO_SETTINGS_MODULE'] = 'oats.settings',但没有任何进展。仍然收到导入错误。
    • 谢谢!没想到
    【解决方案3】:

    出于好奇,我查看了 django 代码以找出 wsgi.py 中 DJANGO_SETTINGS_MODULE 的设置在哪里执行。

    $ python3
    >>> from mysite import wsgi
    Traceback (most recent call last):
    
    from django.core.wsgi import get_wsgi_application
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
    application = get_wsgi_application() =>
    
    In "django/core/wsgi.py"
         def get_wsgi_application() => django.setup(set_prefix=False) =>
    In "django/__init__.py"
          def setup(set_prefix=True):
                  from django.conf import settings
                  from django.utils.log import configure_logging
                  configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
    In "conf/__init__.py"
          settings = LazySettings()
    class LazySettings(LazyObject):
        def __getattr__(self, name=LOGGING_CONFIG):
          self._setup(name)
        def _setup(self, name=None):
            settings_module = os.environ.get(ENVIRONMENT_VARIABLE)
            self._wrapped = Settings(settings_module)
    class Settings:
        def __init__(self, settings_module):
            mod = importlib.import_module(settings_module)  
    
    After which, we have settings.py imported and verified as below:
    >>> mysite.settings.BASE_DIR            <<<===  verified
    '/home/user/Documents/DjangoTutorial/mysite'
    >>> mysite.settings.ROOT_URLCONF        <<<===  verified
    'mysite.urls'
    

    所以先用configure_logging(settings.LOGGING_CONFIG)导入

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-23
      • 2014-06-03
      • 1970-01-01
      • 2020-03-19
      • 2012-07-14
      • 2014-06-28
      • 2019-07-02
      相关资源
      最近更新 更多