Django Rest Framework + Django Channels -> [Errno 111] Connect call failed ('127.0.0.1', 6379)
Я программирую проект с Django (4.2.6), Django Rest Framework (3.14.0), Channels (4.0.0) и Channels-Redis(4.2.0), который выступает в качестве бэкенда для мобильного приложения. До сих пор у меня не было никаких проблем с соединениями Rest API и конечными точками, которые я разработал. Я пытаюсь протестировать соединение через вебсокеты, но получаю следующую ошибку:
Поскольку я новичок, когда дело доходит до 3 упомянутых фреймворков, я старался следовать документации по ним, насколько это было возможно, плюс учебники, которые я нашел об этом.
Settings.py
INSTALLED_APPS = [
'daphne',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'channels',
'rest_framework',
'rest_framework_simplejwt',
'rest_framework_simplejwt.token_blacklist',
'djangochannelsrestframework',
'django_cleanup.apps.CleanupConfig',
'drf_yasg',
'django_filters',
'rangefilter',
# Aplicaciones
'MyApp',
]
ASGI_APPLICATION = 'SeleneServer.asgi.application'
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": [("localhost", 6379)],
},
},
}
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
'rest_framework.authentication.SessionAuthentication'),
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
}
SIMPLE_JWT = {
"ACCESS_TOKEN_LIFETIME": timedelta(hours=12),
"REFRESH_TOKEN_LIFETIME": timedelta(days=7),
'UPDATE_LAST_LOGIN': True
}
Asgi.py
import os
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from django.core.asgi import get_asgi_application
import agenda.api.router
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'SeleneServer.settings')
django_asgi_app = get_asgi_application()
application = ProtocolTypeRouter({
'http': django_asgi_app,
'websocket': AuthMiddlewareStack(
URLRouter(
agenda.api.router.websocket_urlpatterns
)
)
})
Router.py
from django.urls import re_path
from MyApp.api.consumers import MyConsumer
websocket_urlpatterns = [
re_path(r"^ws/", MyConsumer.as_asgi()),
]
Consumers.py
from djangochannelsrestframework import permissions
from djangochannelsrestframework.generics import GenericAsyncAPIConsumer
from djangochannelsrestframework.mixins import ListModelMixin
from djangochannelsrestframework.observer import model_observer
from MyApp.models import MyModel
from MyApp.api.serializers import MyModelSerializer
class MyConsumer(ListModelMixin, GenericAsyncAPIConsumer):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
permissions = (permissions.AllowAny,)
async def connect(self, **kwargs):
await self.model_change.subscribe()
await super().connect()
@model_observer(MyModel)
async def model_change(self, message, observer=None, **kwargs):
await self.send_json(message)
@model_change.serializer
def model_serialize(self, instance, action, **kwargs):
return dict(data=MyModelSerializer(instance=instance).data, action=action.value)
Я не использую docker или что-то подобное, поскольку хочу, чтобы проект сначала работал локально на моем компьютере, а затем загружался на сервер Vercel.
Я попробовал запустить проект без Daphne, так как слышал, что для последних версий Channels она не является обязательной зависимостью, но в результате при тестировании websocket сервер выдал ошибку, что адрес, на который был сделан запрос, не может быть найден:
Not Found: /ws/
[05/Mar/2024 02:31:15] "GET /ws/ HTTP/1.1" 404 3003).
Я также попытался удалить AuthMiddlewareStack из asgi.py, чтобы протестировать соединение, которое не требует, чтобы пользователь вошел в систему, но результаты те же самые, с daphne или без нее.
Я не знаю, рекомендуете ли вы другой способ проверки соединения websocket, так как я использовал Browser WebSocket Client для Chrome и websocket-client для python, всегда на ws://127.0.0.1:8000/ws/
, так как фронтенд, который будет разработан в React Native и еще не будет разработан, но я должен проверить, будет ли работать система websocket, даже если она на очень базовом уровне.
Для работы каналов необходим бэкэнд REDIS. Вам необходимо установить и запустить REDIS для решения ошибки