python Django 4使用passfile连接到Postgresql:“fe_sendauth:未提供密码”

kupeojn6  于 2023-03-28  发布在  Python
关注(0)|答案(3)|浏览(115)

你好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

提前感谢您的帮助。我也很乐意被指出任何误解,在我的想法,因为我是一个新手开发。

62lalag4

62lalag41#

1.在Django项目的settings.py中创建了以下DATABASE条目:

'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'OPTIONS': {
            'service': 'db_service',
            'passfile': '.pgpass',
        },
    }
}

1.在用户主目录中,创建了包含以下信息的文件~/.pg_service.conf

[db_service]
host=localhost
port=5432
dbname=DB_MyProject
user=my_postgres_user

1.在django MyProject根目录下创建一个.pgpass文件,并更改文件chmod 0600 MyProject/.pgpass的权限:

localhost:5432:DB_MyProject:my_postgres_user:my_passwd
vhipe2zx

vhipe2zx2#

没有足够的声誉来评论,所以要添加到gtlee的答案中,我也只能在django项目的主目录中获得密码文件。
看起来,虽然设置环境变量PGSERVICEFILE确实允许您将服务文件放置在Linux系统上的任何位置,但环境变量PGPASSFILE被简单地忽略了。有点烦人,因为它添加了另一个文件添加到. gitignore。
另一种解决方案是使用服务文件,然后像平常一样传入密码,但将其存储在环境变量中。

qcbq4gxm

qcbq4gxm3#

我在@gtlee answer中看到的唯一问题是,您将密码文件存储在项目中。如果您计划将代码推送到代码存储库,这通常不是一个好的做法。您希望将凭据文件保存在代码库之外。这是我所做的:
settings.py

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.postgresql',
    'NAME': os.environ.get('DATABASE_NAME'),
    'USER': os.environ.get('DATABASE_USER'),
    'PASSWORD': os.environ.get('DATABASE_PASSWORD'),
    'HOST': 'localhost',
    'PORT': '5432',
}
}

确保在www.example.com文件中导入操作系统模块settings.py:

import os

然后在我的PostgreSQL服务器所在的Ubuntu服务器上,我在~/.bashrc文件的最后设置了这些环境变量:

export DATABASE_NAME=mydatabase
export DATABASE_USER=myuser 
export DATABASE_PASSWORD=mypassword

接下来只需运行以下命令来重置更改:

source ~/.bashrc

然后,一旦你再次运行python3manage.pyrunserver,它应该可以工作。
快乐编码!:)

相关问题