Django部署后连接PostgreSQL失败:未提供密码错误排查
Django连接PostgreSQL报错:fe_sendauth: no password supplied
错误日志
正在使用StatReloader监听文件变更 执行系统检查... 系统检查未发现问题(0项被屏蔽)。 Exception in thread django-main-thread: Traceback (most recent call last): File "/usr/local/lib/python3.10/dist-packages/django/db/backends/base/base.py", line 289, in ensure_connection self.connect() File "/usr/local/lib/python3.10/dist-packages/django/utils/asyncio.py", line 26, in inner return func(*args, **kwargs) File "/usr/local/lib/python3.10/dist-packages/django/db/backends/base/base.py", line 270, in connect self.connection = self.get_new_connection(conn_params) File "/usr/local/lib/python3.10/dist-packages/django/utils/asyncio.py", line 26, in inner return func(*args, **kwargs) File "/usr/local/lib/python3.10/dist-packages/django/db/backends/postgresql/base.py", line 275, in get_new_connection connection = self.Database.connect(**conn_params) File "/usr/local/lib/python3.10/dist-packages/psycopg2/__init__.py", line 122, in connect conn = _connect(dsn, connection_factory=connection_factory, **kwasync) psycopg2.OperationalError: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: fe_sendauth: no password supplied 上述异常直接导致以下异常: Traceback (most recent call last): File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner self.run() File "/usr/lib/python3.10/threading.py", line 953, in run self._target(*self._args, **self._kwargs) File "/usr/local/lib/python3.10/dist-packages/django/utils/autoreload.py", line 64, in wrapper fn(*args, **kwargs) File "/usr/local/lib/python3.10/dist-packages/django/core/management/commands/runserver.py", line 136, in inner_run self.check_migrations() File "/usr/local/lib/python3.10/dist-packages/django/core/management/base.py", line 574, in check_migrations executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS]) File "/usr/local/lib/python3.10/dist-packages/django/db/migrations/executor.py", line 18, in __init__ self.loader = MigrationLoader(self.connection) File "/usr/local/lib/python3.10/dist-packages/django/db/migrations/loader.py", line 58, in __init__ self.build_graph() File "/usr/local/lib/python3.10/dist-packages/django/db/migrations/loader.py", line 235, in build_graph self.applied_migrations = recorder.applied_migrations() File "/usr/local/lib/python3.10/dist-packages/django/db/migrations/recorder.py", line 81, in applied_migrations if self.has_table(): File "/usr/local/lib/python3.10/dist-packages/django/db/migrations/recorder.py", line 57, in has_table with self.connection.cursor() as cursor: File "/usr/local/lib/python3.10/dist-packages/django/utils/asyncio.py", line 26, in inner return func(*args, **kwargs) File "/usr/local/lib/python3.10/dist-packages/django/db/backends/base/base.py", line 330, in cursor return self._cursor() File "/usr/local/lib/python3.10/dist-packages/django/db/backends/base/base.py", line 306, in _cursor self.ensure_connection() File "/usr/local/lib/python3.10/dist-packages/django/utils/asyncio.py", line 26, in inner return func(*args, **kwargs) File "/usr/local/lib/python3.10/dist-packages/django/db/backends/base/base.py", line 288, in ensure_connection with self.wrap_database_errors: File "/usr/local/lib/python3.10/dist-packages/django/db/utils.py", line 91, in __exit__ raise dj_exc_value.with_traceback(traceback) from exc_value File "/usr/local/lib/python3.10/dist-packages/django/db/backends/base/base.py", line 289, in ensure_connection self.connect() File "/usr/local/lib/python3.10/dist-packages/django/utils/asyncio.py", line 26, in inner return func(*args, **kwargs) File "/usr/local/lib/python3.10/dist-packages/django/db/backends/base/base.py", line 270, in connect self.connection = self.get_new_connection(conn_params) File "/usr/local/lib/python3.10/dist-packages/django/utils/asyncio.py", line 26, in inner return func(*args, **kwargs) File "/usr/local/lib/python3.10/dist-packages/django/db/backends/postgresql/base.py", line 275, in get_new_connection connection = self.Database.connect(**conn_params) File "/usr/local/lib/python3.10/dist-packages/psycopg2/__init__.py", line 122, in connect conn = _connect(dsn, connection_factory=connection_factory, **kwasync) django.db.utils.OperationalError: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: fe_sendauth: no password supplied
排查与解决步骤
1. 验证Django是否正确读取.env中的密码
- 在
settings.py中添加打印语句,启动服务器时检查输出:import os from dotenv import load_dotenv load_dotenv() # 测试用,生产环境需删除 print("DB_PASSWORD:", os.getenv("DB_PASSWORD")) - 或临时在
DATABASES配置中硬编码密码,测试是否能连接:
若硬编码能连接,说明.env加载或变量引用存在问题。DATABASES = { 'default': { # 保留其他配置 'PASSWORD': '你的实际数据库密码', } }
2. 检查PostgreSQL的pg_hba.conf认证配置
- 找到
pg_hba.conf文件(通常路径:/etc/postgresql/<版本号>/main/pg_hba.conf) - 查看本地连接配置行,若为
peer认证:
PostgreSQL会使用系统用户身份验证,忽略密码设置,需改为local all all peermd5或scram-sha-256:local all all md5 - 修改后重启PostgreSQL服务:
sudo systemctl restart postgresql
3. 确认Django数据库配置正确引用环境变量
- 检查
settings.py中的DATABASES配置,确保密码字段正确引用环境变量:DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': os.getenv('DB_NAME'), 'USER': os.getenv('DB_USER'), 'PASSWORD': os.getenv('DB_PASSWORD'), 'HOST': os.getenv('DB_HOST', 'localhost'), 'PORT': os.getenv('DB_PORT', '5432'), } } - 确保在引用环境变量前加载.env文件:
from dotenv import load_dotenv import os load_dotenv()
4. 重启服务清除缓存
- 彻底关闭Django开发服务器后重新启动,确保新配置生效
- 若使用Gunicorn、uWSGI等进程管理器,需重启对应进程
内容的提问来源于stack exchange,提问作者coniformx
相关产品推荐
相关产品推荐

