繁体   English   中英

mysql.connector.errors.DatabaseError:2003(HY000):无法连接到“本地主机”(111)上的 MySQL 服务器。 Flask 应用程序

[英]mysql.connector.errors.DatabaseError: 2003 (HY000): Can't connect to MySQL server on 'localhost' (111). Flask app

我查了那个错误,他们说它与绑定地址有关,我评论了那行,仍然得到那个错误。 此外,当我 ping 服务器时,没有收到任何数据包。 我不知道还能做什么。

def create_app():     
  app = Flask(__name__)
  app.config.from_mapping(
    SECRET_KEY = "***",
    DATABASE_HOST=os.environ.get('****.cleardb.com'),
    DATABASE_PASSWORD=os.environ.get('***'),
    DATABASE_USER=os.environ.get('***'),
    DATABASE=os.environ.get('heroku_****'),     
  )

简短回答: os.environ.get()将返回环境变量的值,如果未设置该环境变量,则返回空字符串。 您要做的是将DATABASE_HOST设置为****.cleardb.com ,但是您的代码正在做的是将DATABASE_HOST设置为空,因为您的环境中没有名为****.cleardb.com的环境变量。 然后,您的客户端假定您要使用localhost (这是您的计算机自己使用的地址,您可能还会看到127.0.0.10.0.0.0 )。

可能存在名为“DATABASE_HOST”的环境变量,或者具有不同名称的环境变量,其值为****.cleardb.com *。 尝试DATABASE_HOST='****.cleardb.com'看看它是否有效,然后您可以切换到在源中使用类似os.environ.get('DATABASE_HOST')的东西,而不是硬编码 Heroku 地址,并在您的机器上将DATABASE_HOST本地设置为 Heroku 地址。

使用您的实际值尝试这样的事情,而不将其提交给版本控制(因为这是一个安全风险),只是为了确保您拥有正确的值:

def create_app():     
  app = Flask(__name__)
  app.config.from_mapping(
    SECRET_KEY = "***",
    DATABASE_HOST='****.cleardb.com',
    DATABASE_PASSWORD='***',
    DATABASE_USER='***',
    DATABASE='heroku_****',
  )

一旦你确认你可以连接硬编码的变量,你应该检查一下Heroku 的配置/环境变量文档是否能帮助你定位。 在 Python 中,您可以访问他们所谓的“配置变量”,就像我一直所说的“环境变量”一样。 正确的结束 state 应该是这样的:

  1. 您在本地计算机上设置了一组环境变量,其中包含您要使用的值。 如果您使用的是 macOS/Linux/bash, 那么有关如何读取和写入环境变量的文档可能会有所帮助。 这些应该具有相同的名称 Heroku 正在使用,因为您希望它们在环境(本地或远程)不同时获得正确的值。 为了这个例子,我们将给他们所有前缀HEROKU_

  2. 您的代码使用os.environ.get()环境变量的适当名称来获取该值,并且它应该在本地(当您的本地数据库运行时)或远程(当您在 Heroku 的云中运行时)获取正确的值)。

从理论上讲,这看起来像这样:

def create_app():     
  app = Flask(__name__)
  app.config.from_mapping(
    SECRET_KEY = os.environ.get('HEROKU_SECRET_KEY'),
    DATABASE_HOST=os.environ.get('HEROKU_DATABASE_HOST'),
    DATABASE_PASSWORD=os.environ.get('HEROKU_DATABASE_PASSWORD'),
    DATABASE_USER=os.environ.get('HEROKU_DATABASE_USER'),
    DATABASE=os.environ.get('HEROKU_DATABASE'),
  )

如果我正确理解您的评论,您似乎正在将 Python 变量设置为您要使用的值(例如“ DATABASE_HOST='some.host-name.example.com' ”),然后将配置映射传递给您的应用您通过向环境询问具有您要使用的的名称的变量来检索值的键,如下所示:

DATABASE_HOST='some.host-name.example.com'

def create_app():     
  app = Flask(__name__)
  app.config.from_mapping(
    DATABASE_HOST=os.environ.get(DATABASE_HOST),
  )

当名为DATABASE_HOSTPython变量设置为'some.host-name.example.com'的值时,os.environ.get(DATABASE_HOST) 告诉 Python 获取名为“some.host-name”的变量的example.com”,而不是“DATABASE_HOST”,来自代码外部的环境。 你看得到差别吗? 一方面,您传递了一个变量,该变量将解析为一个字符串,而 Python 将 go 查找,发现您没有名为“some.host-name.example.com”的环境变量,并且什么也不返回.

如果您有一个名为“DATABASE_HOST”、“HEROKU_DATABASE_HOST”或“DERF”的环境变量,您希望向os.environ.get()传递一个与您的环境变量名称匹配的字符串(因此, os.environ.get('DERF')将返回在您的代码运行的环境中设置的任何DERF值。为了扩展上面的示例,这将起作用,_前提是您有一个名为DATABASE_HOST的环境变量。该环境变量不在你的代码

ANY_VARIABLE_NAME_IT_DOESNT_MATTER='DATABASE_HOST'

def create_app():     
  app = Flask(__name__)
  app.config.from_mapping(
    DATABASE_HOST=os.environ.get(ANY_VARIABLE_NAME_IT_DOESNT_MATTER),
  )

尽管可能有充分的理由做与上述类似的事情,但您也可以这样做,这样会更清晰:

def create_app():     
  app = Flask(__name__)
  app.config.from_mapping(
    DATABASE_HOST=os.environ.get('DATABASE_HOST'),
    # notice the single quotes --^-------------^
  )

* 在此处使用您真实的、未经编辑的主机名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM