如何设置DJANGO_SETTINGS_MODULE env变量?

时间:2016-08-24 23:40:58

标签: python django python-2.7 email

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

@Component(
    {
        selector   : 'my-component' ,
        template   : 'some stuff',
        styleUrls : [aVariableHereThatReturnsTheUrl]
    }
)

export class MyComponent{

    private aVariableHereThatReturnsTheUrl = 'app/src/style/style.css';
}

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

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.

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

3 个答案:

答案 0 :(得分:4)

请勿在应用程序外部进行设置。在DJANGO_SETTINGS_MODULE文件中为wsgi变量输入一个条目。每次启动服务器时,都会自动设置此变量。

例如:

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

答案 1 :(得分:0)

您使用的是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/

答案 2 :(得分:0)

出于好奇,我调查了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)导入