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 не может подключиться к серверу?