配置分模块DJANGO_SETTINGS_MODULE时Django部署报错求助
Django部署到DigitalOcean的模块找不到问题
问题背景
在DigitalOcean部署Django应用,构建成功但部署阶段报错。最初提示找不到config模块,怀疑是wsgi.py里的os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config")配置有问题。配置文件采用Python模块结构,包含common、local、production三个设置文件。修改Dockerfile设置环境变量后,新报错变为ModuleNotFoundError: No module named 'users'。
初始错误追踪
[2022-07-31 03:29:55] Traceback (most recent call last): [2022-07-31 03:29:55] File "<frozen importlib._bootstrap>", line 908, in _find_spec [2022-07-31 03:29:55] AttributeError: 'ConfigurationImporter' object has no attribute 'find_spec' ... [2022-07-31 03:29:55] ImportError: No module named 'config'
文件结构
monorepo/backend-server ├── Dockerfile ├── README.md ├── config │ ├── __init__.py │ ├── common.py │ ├── local.py │ └── production.py ├── docker-compose.yml ├── manage.py ├── requirements.txt ├── urls.py ├── wait_for_postgres.py └── wsgi.py
关键文件代码
wsgi.py
import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config") os.environ.setdefault("DJANGO_CONFIGURATION", "Production") # sys.path.append("/scraft-server") from configurations.wsgi import get_wsgi_application # noqa application = get_wsgi_application()
config.common.py
import os from os.path import join from distutils.util import strtobool from dotenv import load_dotenv import datetime import dj_database_url from configurations import Configuration BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) load_dotenv() class Common(Configuration): # settings
初始Dockerfile
FROM python:3.8 ENV PYTHONUNBUFFERED 1 # 让Docker在构建之间缓存已安装的依赖 COPY ./requirements.txt requirements.txt RUN pip install -r requirements.txt # 将应用代码添加到镜像中 WORKDIR /code/scraft-server COPY scraft-server . WORKDIR /code EXPOSE 8000 # 运行生产服务器 CMD newrelic-admin run-program gunicorn --bind localhost:$PORT --access-logfile - scraft-server.wsgi:application
修改后的Dockerfile
FROM python:3.8 ENV PYTHONUNBUFFERED 1 ENV DJANGO_SETTINGS_MODULE backend-server.config.production ENV DJANGO_CONFIGURATION Production # ENV DJANGO_SETTINGS_MODULE backend-server.config.production # 让Docker在构建之间缓存已安装的依赖 COPY ./requirements.txt requirements.txt RUN pip install -r requirements.txt # 将应用代码添加到镜像中 WORKDIR /code/backend-server COPY backend-server . WORKDIR /code EXPOSE 8000 # 运行生产服务器 CMD newrelic-admin run-program gunicorn --bind localhost:$PORT --access-logfile - backend-server.wsgi:application
新错误追踪
[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] ModuleNotFoundError: No module named 'users'
解决方案建议
- 修正Python路径:在Dockerfile中添加
ENV PYTHONPATH="/code/backend-server",或者取消wsgi.py中sys.path.append("/code/backend-server")的注释,确保应用根目录在Python搜索路径内。 - 修复模块命名问题:Python模块名不允许含连字符,将
backend-server目录重命名为backend_server,同时更新Dockerfile中的环境变量DJANGO_SETTINGS_MODULE为backend_server.config.production,Gunicorn启动命令改为backend_server.wsgi:application。 - 验证代码复制情况:进入容器检查
/code/backend-server目录下是否存在users模块(含__init__.py的文件夹),确认代码被完整复制。
内容的提问来源于stack exchange,提问作者Tyler Kim
相关产品推荐
相关产品推荐

