Docker部署的两个Django3.2项目共享用户、认证及功能的改造问询
解决方案:Django多容器项目合并与资源共享
一、实现注册/认证/用户体系共用
1. 统一数据库访问
两个项目的Django容器必须指向同一个SQL数据库(即项目1的数据库容器),修改项目2的settings.py配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', # 匹配项目1使用的数据库引擎 'NAME': 'project1_db', 'USER': 'db_user', 'PASSWORD': 'db_password', 'HOST': 'project1_db', # 用Docker Compose中项目1数据库的服务名 'PORT': '5432', } }
将项目1的用户应用(比如accounts)添加到项目2的INSTALLED_APPS,并指定统一的用户模型:
INSTALLED_APPS = [ # 其他应用 'accounts', ] AUTH_USER_MODEL = 'accounts.User'
注意:需要把项目1的accounts模块通过卷挂载或镜像打包的方式,让项目2容器能访问到。
2. 共享会话与缓存
让两个项目共用项目1的Redis容器,作为会话存储和缓存后端,修改项目2的settings.py:
CACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://project1_redis:6379/1', 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', } } } SESSION_ENGINE = 'django.contrib.sessions.backends.cache' SESSION_CACHE_ALIAS = 'default'
同时确保两个项目的SECRET_KEY完全一致,否则会话无法跨容器共享。
3. 复用认证接口(可选)
如果不想重复开发认证逻辑,可以让项目2直接调用项目1的认证API(比如/api/auth/login/、/api/auth/register/),通过HTTP请求完成登录注册操作,减少代码冗余。
二、实现跨项目功能模块互导与扩展
1. Docker卷挂载共享模块
避免手动复制文件导致的路径问题,用Docker Compose的卷挂载实现两个项目模块的双向访问:
- 项目1的
docker-compose.yml中,给API、Worker、Scheduler服务添加卷:
services: api: volumes: - ./project1/:/app/ - ./project2/commerce:/app/commerce # 挂载项目2的电商模块到项目1容器 worker: volumes: - ./project1/:/app/ - ./project2/commerce:/app/commerce scheduler: volumes: - ./project1/:/app/ - ./project2/commerce:/app/commerce
- 项目2的
docker-compose.yml中,给电商前端服务添加卷:
services: commerce_frontend: volumes: - ./project2/:/app/ - ./project1/accounts:/app/accounts # 挂载项目1的用户模块到项目2容器
2. 配置Python路径
如果挂载后仍出现模块找不到的问题,在两个项目的settings.py中添加模块所在目录到Python路径:
import sys sys.path.append('/app') # 假设模块都挂载在容器的/app目录下
或者在Dockerfile中设置环境变量:
ENV PYTHONPATH=/app
3. 统一依赖与模块化拆分
合并两个项目的requirements.txt,确保Python依赖(比如Django 3.2、第三方库)版本完全一致,避免兼容性问题。同时将可复用模块(用户、商品、帖子等)拆分为独立的Django应用,在两个项目的INSTALLED_APPS中注册即可调用。
三、解决ModuleNotFoundError: No module named 'commerce'
- 检查容器内是否存在
/app/commerce目录,且目录下有__init__.py文件(必须存在才能被识别为Python模块)。 - 在项目1容器内执行
python -c "import sys; print(sys.path)",确认commerce模块所在目录在Python路径中。 - 如果是将模块打包到镜像中,修改Dockerfile后重新构建镜像;如果用卷挂载,确保本地目录路径正确,Docker Compose配置无误。
内容的提问来源于stack exchange,提问作者Ananth
相关产品推荐
相关产品推荐

