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

Django连接MySQL不遵循settings.py配置的数据库地址问题求助

Django数据库连接异常:配置HOST为127.0.0.1却尝试连接172.18.0.1

我的settings.py数据库配置如下:

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "HOST": "127.0.0.1",
        "PORT": os.getenv("DB_PORT", '3306'),
        "NAME": os.getenv("DB_DATABASE", 'sm'),
        "USER": os.getenv("DB_USER", 'root'),
        "PASSWORD": os.getenv("DB_PASSWORD", ''),
    }
}

运行python manage.py runserver时出现数据库连接错误:

django.db.utils.OperationalError: (1045, "Access denied for user 'root'@'172.18.0.1' (using password: NO)")

明明配置的是127.0.0.1,项目却尝试连接172.18.0.1,求解答。


可能的原因及解决办法

1. 环境变量或代码逻辑覆盖了HOST配置

检查是否存在未注意到的环境变量(比如DB_HOST),或者代码后续有对DATABASES["default"]["HOST"]的覆盖操作。

  • 排查方式:在settings.py中添加一行打印,确认实际生效的HOST值:
    print("实际使用的数据库HOST:", DATABASES["default"]["HOST"])
    
    运行runserver时查看控制台输出,就能知道配置是否被篡改。

2. Docker容器环境的地址映射问题

如果你的Django项目运行在Docker容器内,而MySQL部署在宿主机:

  • 容器内的127.0.0.1指向容器自身,而非宿主机,此时系统会自动用容器所在网络的网关地址(比如172.18.0.1)去访问宿主机服务。
  • 解决办法:
    • 把数据库HOST改成宿主机在Docker网络中的实际IP,或者用host.docker.internal(Windows/macOS)、172.17.0.1(Linux)这类特殊地址替代127.0.0.1。
    • 同时给MySQL授权对应IP的访问权限:
      GRANT ALL PRIVILEGES ON sm.* TO 'root'@'172.18.0.1' IDENTIFIED BY '你的数据库密码';
      FLUSH PRIVILEGES;
      

3. MySQL配置的绑定地址限制

检查MySQL配置文件(my.cnf/my.ini)中的bind-address项:

  • 如果该项被设置为172.18.0.1,而非0.0.0.0或127.0.0.1,会导致连接请求被定向到这个地址。
  • 解决办法:修改bind-address为0.0.0.0(允许所有IP访问)或127.0.0.1,然后重启MySQL服务。

4. 本地代理/端口转发工具干扰

如果运行了代理软件、端口转发工具,可能会将127.0.0.1的数据库请求转发到172.18.0.1地址。

  • 解决办法:暂时关闭这类工具,重新运行项目测试。

内容的提问来源于stack exchange,提问作者MilanBogic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:40:19