You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:40:39