Django 4 使用密码文件连接到 Postgresql:"fe_sendauth: no password supplied"
Django 4 connection to Postgresql using passfile: "fe_sendauth: no password supplied"
你好 SO 和 Django 社区,
我的问题与Django 4有关,因为这个版本已经出现了使用passfile连接Postgres的功能。虽然我已经解决了与以前版本相关的类似错误消息相关问题,但我没有成功解决我的问题。
我想做什么
我想将 Postgres 数据库 DB_MyProject 连接到 django MyProject。在 Django 4 中,您可以使用通行文件而不是在 settings.py 中提供所有 user/password 信息。有关此新功能的文档是 here. The concept of password file in Postgres is explained here, you may also read about connection service here.
在按照我的最佳理解遵循这些文档后,我完成了以下操作:
- 根据建议 here:
在 Django 项目的 settings.py 中创建了以下数据库条目
'default': {
'ENGINE': 'django.db.backends.postgresql',
'OPTIONS': {
'service': 'db_service',
'passfile': '.pgpass',
},
}
}
- 在 pg 配置目录 (
pg_config --sysconfdir
) 中,创建了包含以下信息的文件 pg_service.conf,如 pg docs and django docs:
[db_service]
host=localhost
port=5432
dbname=DB_MyProject
user=my_postgres_user
- 创建了一个 .pgpass 文件,如 pg docs:
localhost:5432:DB_MyProject:my_postgres_user:my_passwd
现在,这个 .pgpass 文件存在于几个位置,作为使它工作的结果:
- 在pg配置目录中(
pg_config --sysconfdir
)
- 在我的普通用户主目录中 ~/
- 在django MyProject根目录下
所有这些文件都是具有相同权限级别的精确副本:
-rw------- 1 my_regular_user my_group 52 Mar 2 18:47 .pgpass
我还在 PGAdmin 中创建了一个指定名称的数据库,并确保用户具有指定密码的权限。
现在我假设它应该工作正常。但是,当我尝试 makemigrations 或 migrate 或 runserver 时,我得到了这个:
django.db.utils.OperationalError: connection to server at "localhost" (::1), port 5432 failed: fe_sendauth: no password supplied
我已经尝试了什么
- 已验证兼容性:Django v4.0.3、PostgreSQL v14.0、psycopg2 v2.9.3
- 创建了一个环境变量 PGPASSFILE,路径为 ~./.pgpass
- 将 ~/.pgpass 的所有权从 my_regular_user 更改为 my_postgres_user 以进行测试,得到相同的结果
- 安装direnv,在项目根目录创建.envrc文件,包含:
export PGPASSFILE=~/.pgpass
提前感谢您的帮助。我也很乐意指出我的想法中的任何误解,因为我是一名新手开发人员。
- 在 Django 项目的
settings.py
中创建了以下数据库条目:
'default': {
'ENGINE': 'django.db.backends.postgresql',
'OPTIONS': {
'service': 'db_service',
'passfile': '.pgpass',
},
}
}
- 在用户主目录中,创建了包含以下信息的文件
~/.pg_service.conf
:
[db_service]
host=localhost
port=5432
dbname=DB_MyProject
user=my_postgres_user
- 在 django MyProject 根目录中创建了一个 .pgpass 文件并更改了文件的权限
chmod 0600 MyProject/.pgpass
:
localhost:5432:DB_MyProject:my_postgres_user:my_passwd
没有足够的声誉来评论所以添加到 gtlee 的答案,我也只能让密码文件工作,如果它在 django 项目的主目录中。
看起来虽然设置环境变量 PGSERVICEFILE 确实允许您将服务文件放在 linux 系统的任何位置,但环境变量 PGPASSFILE 被简单地忽略了。有点烦人,因为它添加了另一个文件以添加到 .gitignore。
另一种解决方案是使用服务文件,然后像往常一样传入密码,但将其存储在环境变量中。
你好 SO 和 Django 社区,
我的问题与Django 4有关,因为这个版本已经出现了使用passfile连接Postgres的功能。虽然我已经解决了与以前版本相关的类似错误消息相关问题,但我没有成功解决我的问题。
我想做什么
我想将 Postgres 数据库 DB_MyProject 连接到 django MyProject。在 Django 4 中,您可以使用通行文件而不是在 settings.py 中提供所有 user/password 信息。有关此新功能的文档是 here. The concept of password file in Postgres is explained here, you may also read about connection service here.
在按照我的最佳理解遵循这些文档后,我完成了以下操作:
- 根据建议 here: 在 Django 项目的 settings.py 中创建了以下数据库条目
'default': {
'ENGINE': 'django.db.backends.postgresql',
'OPTIONS': {
'service': 'db_service',
'passfile': '.pgpass',
},
}
}
- 在 pg 配置目录 (
pg_config --sysconfdir
) 中,创建了包含以下信息的文件 pg_service.conf,如 pg docs and django docs:
[db_service]
host=localhost
port=5432
dbname=DB_MyProject
user=my_postgres_user
- 创建了一个 .pgpass 文件,如 pg docs:
localhost:5432:DB_MyProject:my_postgres_user:my_passwd
现在,这个 .pgpass 文件存在于几个位置,作为使它工作的结果:
- 在pg配置目录中(
pg_config --sysconfdir
) - 在我的普通用户主目录中 ~/
- 在django MyProject根目录下
所有这些文件都是具有相同权限级别的精确副本:
-rw------- 1 my_regular_user my_group 52 Mar 2 18:47 .pgpass
我还在 PGAdmin 中创建了一个指定名称的数据库,并确保用户具有指定密码的权限。
现在我假设它应该工作正常。但是,当我尝试 makemigrations 或 migrate 或 runserver 时,我得到了这个:
django.db.utils.OperationalError: connection to server at "localhost" (::1), port 5432 failed: fe_sendauth: no password supplied
我已经尝试了什么
- 已验证兼容性:Django v4.0.3、PostgreSQL v14.0、psycopg2 v2.9.3
- 创建了一个环境变量 PGPASSFILE,路径为 ~./.pgpass
- 将 ~/.pgpass 的所有权从 my_regular_user 更改为 my_postgres_user 以进行测试,得到相同的结果
- 安装direnv,在项目根目录创建.envrc文件,包含:
export PGPASSFILE=~/.pgpass
提前感谢您的帮助。我也很乐意指出我的想法中的任何误解,因为我是一名新手开发人员。
- 在 Django 项目的
settings.py
中创建了以下数据库条目:
'default': {
'ENGINE': 'django.db.backends.postgresql',
'OPTIONS': {
'service': 'db_service',
'passfile': '.pgpass',
},
}
}
- 在用户主目录中,创建了包含以下信息的文件
~/.pg_service.conf
:
[db_service]
host=localhost
port=5432
dbname=DB_MyProject
user=my_postgres_user
- 在 django MyProject 根目录中创建了一个 .pgpass 文件并更改了文件的权限
chmod 0600 MyProject/.pgpass
:
localhost:5432:DB_MyProject:my_postgres_user:my_passwd
没有足够的声誉来评论所以添加到 gtlee 的答案,我也只能让密码文件工作,如果它在 django 项目的主目录中。
看起来虽然设置环境变量 PGSERVICEFILE 确实允许您将服务文件放在 linux 系统的任何位置,但环境变量 PGPASSFILE 被简单地忽略了。有点烦人,因为它添加了另一个文件以添加到 .gitignore。
另一种解决方案是使用服务文件,然后像往常一样传入密码,但将其存储在环境变量中。