你好SO & Django社区,
我的问题与Django 4有关,因为在这个版本中出现了使用passfile连接Postgres的功能。虽然我已经经历了与以前版本类似的错误消息相关的问题,但我没有成功解决我的问题。
我想做的
我想将Postgres数据库DB_MyProject连接到一个django MyProject。在Django 4中,你可以使用一个密码文件,而不是在settings.py中提供所有用户/密码信息。关于这个新功能的文档在这里。Postgres中密码文件的概念在here中解释,你也可以阅读关于连接服务here的内容。
根据我对这些文档的最佳理解,我做了以下几点:
1.在Django项目的www.example.com中创建了以下DATABASE条目settings.py,如下所示:
'default': {
'ENGINE': 'django.db.backends.postgresql',
'OPTIONS': {
'service': 'db_service',
'passfile': '.pgpass',
},
}
}
1.在pg配置目录(pg_config --sysconfdir
)中,创建了pg_service.conf文件,其中包含以下信息,如pg docs和django文档中所示:
[db_service]
host=localhost
port=5432
dbname=DB_MyProject
user=my_postgres_user
1.创建一个.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
1.我还在PGAdmin中创建了一个具有指定名称的DB,并确保用户具有指定密码的权限。
1.现在我假设它应该工作正常。但是,当我尝试进行迁移或迁移或运行服务器时,我得到了这个:
django.db.utils.OperationalError:连接到服务器“localhost”(::1),端口5432失败:fe_sendauth:未提供密码
我已经尝试过什么
- 验证兼容性: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
提前感谢您的帮助。我也很乐意被指出任何误解,在我的想法,因为我是一个新手开发。
3条答案
按热度按时间62lalag41#
1.在Django项目的
settings.py
中创建了以下DATABASE条目:1.在用户主目录中,创建了包含以下信息的文件
~/.pg_service.conf
:1.在django MyProject根目录下创建一个.pgpass文件,并更改文件
chmod 0600 MyProject/.pgpass
的权限:vhipe2zx2#
没有足够的声誉来评论,所以要添加到gtlee的答案中,我也只能在django项目的主目录中获得密码文件。
看起来,虽然设置环境变量PGSERVICEFILE确实允许您将服务文件放置在Linux系统上的任何位置,但环境变量PGPASSFILE被简单地忽略了。有点烦人,因为它添加了另一个文件添加到. gitignore。
另一种解决方案是使用服务文件,然后像平常一样传入密码,但将其存储在环境变量中。
qcbq4gxm3#
我在@gtlee answer中看到的唯一问题是,您将密码文件存储在项目中。如果您计划将代码推送到代码存储库,这通常不是一个好的做法。您希望将凭据文件保存在代码库之外。这是我所做的:
settings.py
确保在www.example.com文件中导入操作系统模块settings.py:
然后在我的PostgreSQL服务器所在的Ubuntu服务器上,我在~/.bashrc文件的最后设置了这些环境变量:
接下来只需运行以下命令来重置更改:
然后,一旦你再次运行python3manage.pyrunserver,它应该可以工作。
快乐编码!:)