Docker部署对接MongoDB的Django应用出现连接与CSRF报错如何解决
问题根因
你的报错核心原因是Django容器内的MongoDB连接配置指向了localhost:27017,但Docker容器的localhost仅指代当前容器自身,无法访问到同docker-compose下的MongoDB容器。你看到的CSRF报错是衍生问题:Django连接Mongo失败抛出500错误,登录页没有正常渲染出CSRF token,所以提交请求时才会报CSRF校验失败。
具体修改步骤
- 修改Django项目中MongoDB连接配置
打开你的Djangosettings.py文件,找到MongoDB连接的相关配置,将主机地址从localhost替换为docker-compose中MongoDB服务的名称mongodb_container,示例配置参考:
# djongo驱动配置示例 DATABASES = { 'default': { 'ENGINE': 'djongo', 'NAME': '自定义数据库名', 'CLIENT': { 'host': 'mongodb_container', # 填写docker-compose里的MongoDB服务名 'port': 27017, } } } # 直接使用pymongo连接示例 client = pymongo.MongoClient(host='mongodb_container', port=27017)
- 可选:添加启动等待逻辑避免Mongo未就绪报错
depends_on仅保证Mongo容器先启动,不保证Mongo服务完全初始化完成,可能出现Django启动时Mongo还没就绪的偶发连接失败。你可以修改docker-compose里web服务的启动命令,添加等待逻辑:
web: build: . # 等待mongodb_container的27017端口通了再启动Django,需提前在项目根目录放入wait-for-it.sh脚本 command: bash -c "wait-for-it mongodb_container:27017 -- python manage.py runserver 0.0.0.0:8000" volumes: - django_data_container:/home/app/webapp ports: - "8000:8000" depends_on: - mongodb_container
临时测试可以用sleep命令简化:command: bash -c "sleep 10 && python manage.py runserver 0.0.0.0:8000"
- 重启容器生效
修改完成后执行以下命令重建容器即可:
docker-compose down -v docker-compose up --build
内容的提问来源于stack exchange,提问作者Usman
相关产品推荐
相关产品推荐

