密码验证失败,密码复杂

JJD*_*JJD 7 python passwords postgresql psycopg2

我编写了一个 Python 脚本,它使用psycopg2 2.6Python 2.7.8连接到本地 PostgreSQL 数据库。连接设置和命令如下:

HOST = '127.0.0.1'
DATABASE_NAME = 'myappdatabase'
DATABASE_PORT = '5432'
DATABASE_USER = 'myappuser'
DATABASE_PASSWORD = 'secret'
DATABASE_TABLE = 'myappdata'

def _database_connection():
    conn_string = "host='{0}' dbname='{1}' port='{2}' user='{3}' \
        password='{4}'".format(HOST, DATABASE_NAME, DATABASE_PORT, \
        DATABASE_USER, DATABASE_PASSWORD)
    return psycopg2.connect(conn_string)
Run Code Online (Sandbox Code Playgroud)

该脚本在安装了 PostgreSQL 9.4 的机器上没有问题。里面的配置sudo vi /etc/postgresql/9.4/main/pg_hba.conf没有修改,长这个样子,没有注释:

local   all             postgres                                peer
local   all             all                                     peer
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5
Run Code Online (Sandbox Code Playgroud)

我还可以使用pgAdmin III成功连接到同一个数据库。

问题

在具有相同设置的第二台机器上,我无法通过脚本进行连接。出现以下错误:

psycopg2.OperationalError:致命:用户“myappuser”的
密码验证失败致命:用户“myappuser”的密码验证失败

这两台机器的唯一区别数据库密码。所以我把它改成一个简单的密码 - 砰,它起作用了。所以我改回了一个复杂的...,它并不能再工作。密码是这样的:

DATABASE_PASSWORD = 'zyx@12AA\w2'

所以我想:“这很愚蠢。一定是我的错误。” 所以我将第一台机器上的数据库密码设置为与第二台机器上的相同。哎呀,Python 脚本也失败了

mat*_*ata 6

在这种情况下,密码中的反斜杠被解释为转义字符。Python 会将反斜杠\w视为文字,\即使它没有指定为原始字符串,因为\w它不是有效的转义序列,但底层库也会解析转义序列,因此必须对反斜杠进行转义(加倍)。

为避免这种情况,请将连接参数指定为关键字参数

psycopg2.connect(host=HOST,
                 database=DATABASE_NAME,
                 port=DATABASE_PORT,
                 user=DATABASE_USER,
                 password=DATABASE_PASSWORD)
Run Code Online (Sandbox Code Playgroud)

这避免了密码中特殊字符的问题。密码中的单引号字符也会破坏连接字符串。