Django 导入错误:仅在运行测试时无法导入名称"设置"manage.py



我是Django的新手,最近继承了一个项目,该项目有两个主要应用程序(my_appmy_soc_app),目录结构类似于文章末尾所示。

我正在尝试运行项目的测试,当我运行python manage.py test时,主应用程序my_app下的测试都运行良好,但当它尝试在my_soc_app下运行测试时,它在尝试执行from my_soc_app import settings时失败,错误如下所示。

当我试图运行测试时,我不明白为什么它抱怨只导入。

my_app/my_soc_app/my_soc_app/soc_app1/tests/testrongoc_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套接字服务。其主要目的是从应用程序的移动客户端接收高频更新,并将事件发布给套接字侦听器(主要是门户网站/前端)。

我这样运行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

您应该使用from django.conf import settings导入您的设置

相关内容

最新更新