为什么需要设置DJANGO_SETTINGS_MODULE?

13 投票
3 回答
10712 浏览
提问于 2025-04-15 18:15

每次我通过SSH登录到我的服务器时,都需要输入以下内容:

export DJANGO_SETTINGS_MODULE=settings

如果我不这样做,使用manage.py模块的任何操作都会失败。

我的manage.py文件里添加了以下代码:

if "notification" in settings.INSTALLED_APPS:
    from notification import models as notification

    def create_notice_types(app, created_models, verbosity, **kwargs):
        notification.create_notice_type("friends_invite", _("Invitation Received"), _("you have received an invitation"))
        notification.create_notice_type("friends_accept", _("Acceptance Received"), _("an invitation you sent has been accepted"))

    signals.post_syncdb.connect(create_notice_types, sender=notification)
else:
    print "Skipping creation of NoticeTypes as notification app not found"

有什么建议吗?

3 个回答

0

默认情况下,manage.py 会在它自己所在的文件夹里寻找一个设置模块。如果找不到,就会报错,提示你使用 django-admin.py 来代替。实际上,它在运行 execute_manager 之前并不会设置环境。如果你需要在调用管理功能之前运行一些钩子(也就是一些特定的代码),我看到的建议是把这些钩子放在相关应用的 models.py 文件里。

6

你需要设置一个叫做 DJANGO_SETTINGS_MODULE 的环境变量,因为这是 Django 知道你的设置模块名称的方式(这样你可以为不同的项目或测试和开发设置不同的配置)。你可以在脚本中 导入 Django 之前设置这个变量(无论是直接还是间接),但当你运行 Django 提供的脚本时,这样做效果不大。

最简单的解决办法可能就是在你的命令行启动脚本中设置 DJANGO_SETTINGS_MODULE,这样你就不需要每次手动设置了。通常可以把它添加到 .bash_profile 和 .bashrc 文件中(如果你确实在使用 bash 的话)。

11

你的manage.py文件正在引用一个应用程序(notifications)。这会导致Django抱怨因为DJANGO_SETTINGS_MODULE没有设置,因为Django环境还没有准备好。

顺便说一下,你可以手动强制设置环境,但老实说,我不建议在manage.py里这么做。这在我看来并不是一个好的做法。

下面是如何在任何应用程序(或者说程序)中手动设置Django环境的方法:

# set up the environment using the settings module
from django.core.management import setup_environ
from myapp import settings
setup_environ(settings)

撰写回答