Django.db.utils.OperationalError: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: django aws

При попытке получить данные из базы данных я получаю следующую ошибку:

2022-01-30 11:47:05,004 ERROR    Exception inside application: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory
        Is the server running locally and accepting connections on that socket?
Traceback (most recent call last):
  File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
    self.connect()
  File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/django/utils/asyncio.py", line 33, in inner
    return func(*args, **kwargs)
  File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/django/db/backends/base/base.py", line 200, in connect
    self.connection = self.get_new_connection(conn_params)
  File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/django/utils/asyncio.py", line 33, in inner
    return func(*args, **kwargs)
  File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/django/db/backends/postgresql/base.py", line 187, in get_new_connection
    connection = Database.connect(**conn_params)
  File "/var/app/venv/staging-LQM1lest/lib64/python3.8/site-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: No such file or directory
        Is the server running locally and accepting connections on that socket?

Вышеуказанная ошибка возникает только в производстве. У меня есть внешняя база данных в RDS (amazonAWS), и я не уверен, почему она все еще пытается установить соединение с "/var/run/postgresql/.s.PGSQL.5432".

Вот мои настройки базы данных в settings.py:

DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': 'postgres',
            'USER': os.getenv('RDS_USER'),
            'PASSWORD': os.getenv('RDS_PASSWORD'),
            'HOST': os.getenv('RDS_HOST'),
            'PORT': '5432'
        }

Я использую следующий сниппет, который аутентифицирует пользователей с помощью токенов в каналах:

from urllib.parse import parse_qs

from channels.auth import AuthMiddlewareStack
from channels.db import database_sync_to_async
from django.conf import settings
from django.contrib.auth import get_user_model
from django.contrib.auth.models import AnonymousUser
from django.db import close_old_connections
from jwt import decode as jwt_decode
from jwt import InvalidSignatureError, ExpiredSignatureError, DecodeError
from users.models import User

# User = get_user_model()

# source: https://github.com/joshua-hashimoto/django-channels-jwt-auth-middleware
class JWTAuthMiddleware:
    def __init__(self, app):
        self.app = app

    async def __call__(self, scope, receive, send):
        close_old_connections()
        try:
            if(jwt_token_list := parse_qs(scope["query_string"].decode("utf8")).get('token', None)):
                jwt_token = jwt_token_list[0]
                jwt_payload = self.get_payload(jwt_token)
                user_credentials = self.get_user_credentials(jwt_payload)
                user = await self.get_logged_in_user(user_credentials)
                scope['user'] = user
                print("FINAL USER: ", user)
            else:
                scope['user'] = AnonymousUser()

        except (InvalidSignatureError, KeyError, ExpiredSignatureError, DecodeError) as e:
            print("Error: ", e)

        return await self.app(scope, receive, send)

    def get_payload(self, jwt_token):
        payload = jwt_decode(
            jwt_token, settings.SECRET_KEY, algorithms=["HS256"])

        return payload

    def get_user_credentials(self, payload):

        user_id = payload['user_id']
        return user_id

    async def get_logged_in_user(self, user_id):
        user = await self.get_user(user_id)
        return user

    @database_sync_to_async
    def get_user(self, user_id):
        # User = get_user_model()
        try:
            return User.objects.get(id=user_id) # This is primary key for user model !!!! Problem here
        except User.DoesNotExist:
            print("DOEST EXIST")
            return AnonymousUser()


def JWTAuthMiddlewareStack(app):
    return JWTAuthMiddleware(AuthMiddlewareStack(app))
    

Вебсокеты работают нормально, я проверил, запустив daphne на порту 5000. После отладки я понял, что проблема возникает в User.objects.get(id=user_id) в методе get_user(), который помечен @database_sync_to_async декоратором.

Я уверен, что это не проблема с моей конфигурацией AWS или конфигурацией settings.py, потому что все другие представления успешно подключаются к базе данных и делают запросы. Проблема возникает при использовании async и await. Как я могу решить эту проблему?

В течение последней недели я пробовал различные решения, некоторые из которых приведены ниже.

django не может подключиться к RDS postgresql

PostgreSQL: Почему psql не может подключиться к серверу?

Вернуться на верх