【问题标题】:How can I correctly set DJANGO_SETTINGS_MODULE for my Django project (I am using virtualenv)?如何为我的 Django 项目(我正在使用 virtualenv)正确设置 DJANGO_SETTINGS_MODULE?
【发布时间】:2012-02-08 05:42:11
【问题描述】:

我在为我的 Django 项目设置 DJANGO_SETTINGS_MODULE 时遇到了一些问题。

我在~/dev/django-project 有一个目录。在这个目录中,我有一个使用 virtualenv 设置的虚拟环境,还有一个名为“blossom”的 django 项目,其中有一个名为“onora”的应用程序。从~/dev/django-project/ 运行tree -L 3 显示以下内容:

.
├── Procfile
├── blossom
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── fixtures
│   │   └── initial_data_test.yaml
│   ├── manage.py
│   ├── onora
│   │   ├── __init__.py
│   │   ├── __init__.pyc
│   │   ├── admin.py
│   │   ├── admin.pyc
│   │   ├── models.py
│   │   ├── models.pyc
│   │   ├── tests.py
│   │   └── views.py
│   ├── settings.py
│   ├── settings.pyc
│   ├── sqlite3-database
│   ├── urls.py
│   └── urls.pyc
├── blossom-sqlite3-db2
├── requirements.txt
└── virtual_environment
    ├── bin
    │   ├── activate
    │   ├── activate.csh
    │   ├── activate.fish
    │   ├── activate_this.py
    │   ├── django-admin.py
    │   ├── easy_install
    │   ├── easy_install-2.7
    │   ├── gunicorn
    │   ├── gunicorn_django
    │   ├── gunicorn_paster
    │   ├── pip
    │   ├── pip-2.7
    │   ├── python
    │   └── python2.7 -> python
    ├── include
    │   └── python2.7 -> /System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7
    └── lib
        └── python2.7

我正在尝试使用命令从数据库中转储我的数据

django-admin.py dumpdata

我的方法是运行cd ~/dev/django-project,然后运行source virtual_environment/bin/activate,然后运行django-admin.py dumpdata

但是,我收到以下错误:

ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.

我做了一些谷歌搜索,发现了这个页面:https://docs.djangoproject.com/en/dev/topics/settings/#designating-the-settings

告诉我这个

当您使用 Django 时,您必须告诉它您正在使用哪些设置。 通过使用环境变量 DJANGO_SETTINGS_MODULE 来执行此操作。这 DJANGO_SETTINGS_MODULE 的值应该是 Python 路径语法,例如 mysite.settings。请注意,设置模块应该在 Python 上 导入搜索路径。

根据Setting DJANGO_SETTINGS_MODULE under virtualenv? 的建议,我添加了这些行

export DJANGO_SETTINGS_MODULE="blossom.settings"
echo $DJANGO_SETTINGS_MODULE

到 virtual_environment/bin/activate。现在,当我运行 activate 命令以激活虚拟环境时,我得到输出读数:

DJANGO_SETTINGS_MODULE set to blossom.settings

这对我来说看起来不错,但现在我遇到的问题是运行

django-admin.py dumpdata

返回以下错误:

ImportError: Could not import settings 'blossom.settings' (Is it on sys.path?): No module named blossom.settings

我做错了什么?如何查看sys.path?这应该如何工作?

谢谢。

【问题讨论】:

    标签: django django-settings


    【解决方案1】:

    除了初始项目创建之外,不要运行django-admin.py。对于之后的所有内容,请使用 manage.py,它负责查找设置。

    【讨论】:

    • 谢谢 -- python blossom/manage.py dumpdata 按预期工作。
    • 是的。那么为什么 django 文档会说“使用 configure() 或 DJANGO_SETTINGS_MODULE 中的一个。不能同时使用,而且也不能。” ? docs.djangoproject.com/en/dev/topics/settings
    • 当前的想法——正如 "DeployDjango" site 和最近的 Two Scoops of Django 书中所介绍的那样——是 django-admin.py 具有单独的设置功能非常好,实际上比使用manage.py
    • 但是,但是.. 但是.. dumpdata 怎么样。我的生活中需要它。
    【解决方案2】:

    我刚刚遇到了同样的错误,最终设法弄清楚发生了什么(大线索是ImportError 中的(Is it on sys.path?))。

    你需要将你的项目目录添加到PYTHONPATH——这就是文档的意思

    请注意,设置模块应位于 Python 导入搜索路径中。

    为此,运行

    $ export PYTHONPATH=$PYTHONPATH:$PWD
    

    在运行 django-admin.py 之前从 ~/dev/django-project 目录。

    您可以将此命令(将 $PWD 替换为项目的实际路径, ~/dev/django-project)添加到您的 virtualenv 的 source 脚本中。如果您选择在某个时候前进到virtualenvwrapper(专为这种情况而设计),您可以将export PY... 行添加到自动生成的postactivate 挂钩脚本中。

    mkdjangovirtualenv 进一步自动执行此操作,为您在 Python 路径中添加适当的条目,但我自己没有测试过。

    【讨论】:

    • 脏。但工作和有用。你鼓励规避问题。如果某些东西不在 sys.path 上,这意味着它需要被打包和安装,而不是被入侵到 sys.path 上。我知道,我正在解决一个问题,同时又创造了两个问题。
    • 有趣:如果不是通过manage.pydjango-admin.py--pythonpath 选项或PYTHONPATH,您认为应该如何将开发中的Django 项目添加到sys.path env var(没有一个看起来比其他的“更脏”..)
    • 打包它(创建 setup.py)并通过 pip inestall [-e] 安装。看看更长的解释:gist.github.com/bartekbrak/42d59fd43a9af14a0cc5
    【解决方案3】:

    在类 unix 的机器上,您可以像这样简单地为 virtualenv 设置别名,并使用别名而不是每次都键入:

    .bashrc

    alias cool='source /path_to_ve/bin/activate; export DJANGO_SETTINGS_MODULE=django_settings_folder.settings; cd path_to_django_project; export PYTHONPATH=$PYTHONPATH:$PWD'

    【讨论】:

    • 与其他答案相比,这实际上解决了我的问题。谢谢!
    【解决方案4】:

    我最喜欢的替代方法是以 python 包语法将设置文件作为运行时参数传递给 manage.py,例如:

    python manage.py runserver --settings folder.filename
    

    更多信息django docs

    【讨论】:

      【解决方案5】:

      我知道有很多答案,但这个对我有用只是为了记录。

      1. 导航到所有虚拟环境所在的 .virtual_env 文件夹。
      2. 转到特定于您的项目的环境文件夹
      3. 追加export DJANGO_SETTINGS_MODULE=<django_project>.settingsexport DJANGO_SETTINGS_MODULE=<django_project>.settings.local,如果您使用的是存储在设置文件夹中的单独设置文件。

      【讨论】:

        【解决方案6】:

        解决此问题的另一种方法是使用 python dotenv 包,并在 .env 文件中包含 PYTHONPATH 和 DJANGO_SETTINGS_MODULE 以及其他环境变量。然后修改您的 manage.py 和 wsgi.py 以按照说明中的说明加载它们。

        from dotenv import load_dotenv
        load_dotenv()
        

        【讨论】:

          【解决方案7】:

          我在 Windows 机器上工作时遇到了类似的错误。我的问题是使用了错误的调试配置。使用 Python:django 作为调试配置选项。 首先确保您已正确导出/设置 django_settings_module here.

          【讨论】:

            猜你喜欢
            • 2012-10-02
            • 1970-01-01
            • 1970-01-01
            • 2011-11-27
            • 2016-06-26
            • 2016-07-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多