部署Django应用至DigitalOcean时遇ModuleNotFoundError问题求助
Django部署DigitalOcean时ModuleNotFoundError问题修复
问题描述
通过wsgi.py和Dockerfile部署Django应用到DigitalOcean,构建成功但部署阶段报错,提示ModuleNotFoundError: No module named 'users'。使用manage.py startapp创建了users和documents应用,推测是路径配置问题导致INSTALLED_APPS中的应用无法被识别。
错误日志
[2022-07-31 05:49:23] File "/code/scraft-server/wsgi.py", line 14, in <module> [2022-07-31 05:49:23] from configurations.wsgi import get_wsgi_application # noqa [2022-07-31 05:49:23] File "/usr/local/lib/python3.8/site-packages/configurations/wsgi.py", line 8, in <module> [2022-07-31 05:49:23] application = get_wsgi_application() [2022-07-31 05:49:23] File "/usr/local/lib/python3.8/site-packages/django/core/wsgi.py", line 12, in get_wsgi_application [2022-07-31 05:49:23] django.setup(set_prefix=False) [2022-07-31 05:49:23] File "/usr/local/lib/python3.8/site-packages/django/__init__.py", line 24, in setup [2022-07-31 05:49:23] apps.populate(settings.INSTALLED_APPS) [2022-07-31 05:49:23] File "/usr/local/lib/python3.8/site-packages/django/apps/registry.py", line 91, in populate [2022-07-31 05:49:23] app_config = AppConfig.create(entry) [2022-07-31 05:49:23] File "/usr/local/lib/python3.8/site-packages/django/apps/config.py", line 223, in create [2022-07-31 05:49:23] import_module(entry) [2022-07-31 05:49:23] File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module [2022-07-31 05:49:23] return _bootstrap._gcd_import(name[level:], package, level) [2022-07-31 05:49:23] ModuleNotFoundError: No module named 'users'
文件目录结构
monorepo ├── README.md ├── __init__.py ├── backend-server │ ├── users //(created with startapp) │ ├── documents //(created with startapp) │ ├── config │ │ ├── common.py │ │ ├── local.py │ │ ├── production.py │ ├── ... ├── docker-compose.yml ├── manage.py ├── requirements.txt ├── users ├── urls.py ├── wait_for_postgres.py └── wsgi.py
相关文件代码
wsgi.py
import os from configurations.wsgi import get_wsgi_application # noqa application = get_wsgi_application()
config.production.py
import os from .common import Common class Production(Common): INSTALLED_APPS = ( # ... # My apps "users", "document", # etc "corsheaders", "gunicorn", ) SECRET_KEY = os.getenv("DJANGO_SECRET_KEY") # all other configs are set inside config.common.py
DockerFile
FROM python:3.8 ENV PYTHONUNBUFFERED 1 ENV DJANGO_SETTINGS_MODULE backend-server.config.production ENV DJANGO_CONFIGURATION Production # Allows docker to cache installed dependencies between builds COPY ./requirements.txt requirements.txt RUN pip install -r requirements.txt # Adds our application code to the image WORKDIR /code/backend-server COPY backend-server . WORKDIR /code EXPOSE 8000 # Run the production server CMD newrelic-admin run-program gunicorn --bind localhost:$PORT --access-logfile - backend-server.wsgi:application
问题根源
- INSTALLED_APPS路径错误:
users和documents应用属于backend-server包的子模块,但配置中直接写"users"、"document"(还存在拼写错误,应为documents),导致Django无法定位模块。 - 冗余目录干扰:根目录下存在空的
users目录,可能造成路径识别混淆。
修复步骤
1. 修正INSTALLED_APPS配置
修改config/production.py,将应用改为完整的包路径,同时修正拼写错误:
class Production(Common): INSTALLED_APPS = ( # ... 保留原有第三方应用 # 替换为完整包路径 "backend-server.users", "backend-server.documents", "corsheaders", "gunicorn", ) # ... 其他配置不变
2. 确保backend-server为有效Python包
检查backend-server目录下是否存在__init__.py文件(空文件即可),如果没有则创建,确保Python能识别该目录为可导入包。
3. 删除冗余目录
删除根目录下的空users目录,避免路径混淆:
rm -rf ./users
4. 验证Docker配置
当前Dockerfile的路径配置是正确的:将backend-server内容复制到/code/backend-server,工作目录设为/code,而/code会被加入Python的sys.path,Django可以正常识别backend-server包。
验证修复
重新构建镜像并部署,若仍有问题,可进入容器验证模块导入:
docker exec -it <容器ID> python >>> import backend-server.users >>> import backend-server.documents
无报错则说明路径配置正确。
内容的提问来源于stack exchange,提问作者Tyler Kim
相关产品推荐
相关产品推荐

