有没有办法在Python 2.7.5中的MySQLdb.connect中将secure_auth设置为false?

时间:2014-11-04 02:50:06

标签: python mysql

我正在尝试运行用Python 2.7.5编写的脚本(不使用Django)。当它尝试使用MySQLdb.connect()方法连接到远程mysql服务器时,它会抛出以下错误:

_mysql_exceptions.OperationalError: (2049, "Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled)")

我已经读完了这个问题:

有没有办法在MySQLdb.connect()方法中设置一个参数来将secure_auth设置为false?无需更改任何密码或从cmd行运行命令。我查看了official docs,但似乎没有任何内容。

我尝试将secure_auth=False添加到参数中但会引发错误(如下面的代码所示)。

的Python:

def get_cursor():
    global _cursor
    if _cursor is None:
        try:
            db = MySQLdb.connect(user=_usr, passwd=_pw, host='external.website.com', port=3306, db=_usr, charset="utf8")
            # tried this but it doesnt work (as expect but tried anyway) which throws this error
            # TypeError: 'secure_auth' is an invalid keyword argument for this function
            # db = MySQLdb.connect(user=_usr, passwd=_pw, host='external.website.com', port=3306, db=_usr, charset="utf8", secure_auth=false)
            _cursor = db.cursor()
        except MySQLdb.OperationalError:
            print "error connecting"
            raise
    return _cursor

3 个答案:

答案 0 :(得分:3)

我花费了大量时间来处理MySQLdb源代码,并确定如果不修补MySQLdb的C包装代码就无法完成。从理论上讲,您应该能够传递SECURE_CONNECTION标志以指定不想使用不安全的旧密码:

MySQLdb.connect(..., client_flags=MySQLdb.constant.CLIENT.SECURE_CONNECTION)

但MySQLdb代码实际上从未检查过该标志,并且在调用MySQL连接代码时从不配置secure_connection选项,因此它总是默认需要新式密码。

可能的修复包括:

  • 修补MySQLdb代码
  • 使用旧版本的MySQL客户端库
  • 更新MySQL服务器上的密码
  • 使用新式密码创建一个新用户

抱歉,我没有更好的答案。我自己就遇到了这个问题!

答案 1 :(得分:1)

我知道摩西的答案已经过验证,但我想根据他的建议提供我的工作。

我以前为我的python安装了mysql_python,并安装了mysql的brew版本。

我发现了所有这些。

我通过查找源代码的最后一个稳定版本来寻找安装MySQLdb的方法。

我编译了它们(遵循isntructions here),安装它们然后我找了一个稳定版本的MySQL客户端(MySQL网站是最好的地方)并安装完全适合我的5.5版本要求。

我让mysql自动启动然后重新启动我的计算机(但你可以重新启动apache)并检查所有路径是否正确并且右边包含在正确的位置(你可以检查上面的链接)。

现在一切正常!

希望它有所帮助。

答案 2 :(得分:0)

SSL是一个单独的参数,您可以在连接参数中设置...以下是源代码中的注释...尝试检查mysql_ssl_set()文档。

 ssl
          dictionary or mapping, contains SSL connection parameters;
          see the MySQL documentation for more details
          (mysql_ssl_set()).  If this is set, and the client does not
          support SSL, NotSupportedError will be raised.

本文档讨论了所有安全参数 - http://dev.mysql.com/doc/refman/5.0/en/mysql-ssl-set.html ...

我没有看到任何禁用安全身份验证的内容......