Django ImportError:仅在运行manage.py test时无法导入名称“设置”

时间:2019-01-18 09:28:14

标签: python django

我是Django的新手,最近继承了一个项目,该项目有两个主要应用程序(my_soc_apppython manage.py test),其目录结构与文章末尾所示的目录结构相似。

我正在尝试运行项目的测试,并且当我运行my_app时,主应用程序my_soc_app下的测试都运行良好,但是当它尝试在{{1 }}运行时,尝试使用以下显示的错误进行from my_soc_app import settings时失败。

当我尝试运行测试时,我无法弄清楚为什么它抱怨仅导入

my_app / my_soc_app / my_soc_app / soc_app1 / tests / test_soc_app1.py中的导入为:

import asyncio
from unittest import TestCase, mock
from uuid import uuid4

import aioredis
import asyncpg
from aiohttp.test_utils import setup_test_loop, unittest_run_loop

from my_soc_app import settings
from my_soc_app.auth.user import User
from my_soc_app.services import Tracking

错误输出

运行python manage.py test my_soc_app时出现的错误是:

$ python manage.py test my_soc_app
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
E
======================================================================
ERROR: my_soc_app.my_soc_app.soc_app1.tests.test_soc_app1 (unittest.loader._FailedTest)
----------------------------------------------------------------------
ImportError: Failed to import test module: my_soc_app.my_soc_app.soc_app1.tests.test_soc_app1
Traceback (most recent call last):
  File "/usr/lib/python3.6/unittest/loader.py", line 428, in _find_test_path
    module = self._get_module_from_name(name)
  File "/usr/lib/python3.6/unittest/loader.py", line 369, in _get_module_from_name
    __import__(name)
  File "/<...absolute.path...>/my_app/my_soc_app/my_soc_app/soc_app1/tests/test_soc_app1.py", line 9, in <module>
    from my_soc_app import settings
ImportError: cannot import name 'settings'


----------------------------------------------------------------------

背景

my_app是项目的基础应用程序,其下有几个子应用程序。这是定义和实现主要逻辑和api(帐户,服务等)的地方

my_soc_app是在单独的容器中运行的Web套接字服务。它的主要目的是从应用程序的移动客户端接收高频更新,并将事件发布到套接字侦听器(主要是Web门户/前端)。

我这样运行my_app

python manage.py runserver

并像这样测试它:

python manage.py test my_app

我这样运行'my_soc_app`:

cd my_soc_app && python run.py

并希望应该像这样测试它:

python manage.py test my_soc_app

./ manage.py的内容是:

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_app.settings")
    try:
        from django.core.management import execute_from_command_line
    except ImportError:
        # The above import may fail for some other reason. Ensure that the
        # issue is really that Django is missing to avoid masking other
        # exceptions on Python 2.
        try:
            import django  # noqa
        except ImportError:
            raise ImportError(
                "Couldn't import Django. Are you sure it's installed and "
                "available on your PYTHONPATH environment variable? Did you "
                "forget to activate a virtual environment?"
            )
        raise
    execute_from_command_line(sys.argv)

./ my_soc_app / run.py的内容为:

from aiohttp import web

from my_soc_app import settings
from my_soc_app.app import get_app

if __name__ == "__main__":
    application = get_app()
    web.run_app(
        application,
        host=settings.BIND_HOST,
        port=settings.BIND_PORT,
    )

目录结构

该项目的目录结构如下。

project/
  manage.py

  my_app/
    __init__.py

    settings/
      __init__.py
      my_app.py

    apps/
      __init__.py

      app1/
        __init__.py

        tests/
          __init__.py
          test_app1.py

  my_soc_app/
    __init__.py
    run.py

    my_soc_app/
      __init__.py

        settings/
          __init__.py
          my_soc_app.py

        soc_app1/
          __init__.py
          app.py
          views.py

          tests/
            __init__.py
            test_soc_app1.py

1 个答案:

答案 0 :(得分:0)

您应该使用from django.conf import settings

导入设置