Django,redis,rqworker,docker проблема с конфигурацией
Я пытаюсь использовать redis для постановки задач в очередь с помощью rqworker для бэкенда django, который также имеет приложение asgi. Я использовал daphne для запуска приложения asgi. Я пытаюсь докеризировать все приложение с помощью docker compose. Вот структура каталогов моего проекта Django:
docker-compose.yml
version: '3'
services:
backend:
build: .
command: python3 manage.py runserver 0.0.0.0:8000
ports:
- "8000:8000"
volumes:
- .:/app
depends_on:
- redis
worker:
build: .
environment:
- DJANGO_SETTINGS_MODULE=backend.settings
command: daphne -b 0.0.0.0 -p 8001 backend.asgi:application
volumes:
- .:/app
depends_on:
- redis
worker2:
build: .
environment:
- DJANGO_SETTINGS_MODULE=backend.settings
command: python3 manage.py rqworker default
volumes:
- .:/app
depends_on:
- backend
- redis
redis:
image: redis:latest
ports:
- "6379:6379"
Я столкнулся с такой проблемой:
(chai) narsimhar@Narsimhas-MacBook-Pro backend % docker-compose up
.....
.....
.....
.....
worker-1 | File "/app/./backend/asgi.py", line 15, in <module>
worker-1 | from users.routing import websocket_urlpatterns
worker-1 | File "/app/./users/routing.py", line 3, in <module>
worker-1 | from . import consumers
worker-1 | File "/app/./users/consumers.py", line 8, in <module>
worker-1 | from users.tasks import prep_text
worker-1 | File "/app/./users/tasks.py", line 20, in <module>
worker-1 | async def prep_text(text):
worker-1 | File "/usr/local/lib/python3.10/site-packages/django_rq/decorators.py", line 28, in job
worker-1 | queue = get_queue(queue)
worker-1 | File "/usr/local/lib/python3.10/site-packages/django_rq/queues.py", line 164, in get_queue
worker-1 | from .settings import QUEUES
worker-1 | File "/usr/local/lib/python3.10/site-packages/django_rq/settings.py", line 12, in <module>
worker-1 | raise ImproperlyConfigured("You have to define RQ_QUEUES in settings.py")
worker-1 | django.core.exceptions.ImproperlyConfigured: You have to define RQ_QUEUES in settings.py
worker-1 exited with code 1
релевантная информация:
settings.py
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'channels',
'users',
'django_rq',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
RQ_QUEUES = {
'default': {
'HOST': 'redis',
'PORT': 6379,
'DB': 0,
'DEFAULT_TIMEOUT': 360,
},
}
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
# 'channels.middleware.AuthMiddlewareStack',
]
ROOT_URLCONF = 'backend.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'backend.wsgi.application'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_TZ = True
STATIC_URL = 'static/'
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
ASGI_APPLICATION = 'backend.asgi.application'
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": [('redis', 6379)],
},
},
}
tasks.py
from django_rq import job
import re
from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync
from users.rag import llm
from django.conf import settings
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings')
settings.configure()
django.setup()
pattern = re.compile(r'[?.\s]*[A-Za-z\s]*\?')
@job
async def prep_text(text):
processed_text = pattern.findall(text)
x=''
for item in processed_text:
x+=item
if x != '':
await send_result(await llm.query(x))
async def send_result(result):
from users.consumers import JobConsumer
channel_layer = get_channel_layer()
await channel_layer.group_send(
f"result",
{
'type': 'send_result',
'result': result,
}
)
Кажется, я понимаю, что каким-то образом рабочий не может прочитать файл настроек django. Кто-нибудь может мне помочь?
Я пробовал изменять настройки и файлы конфигурации для служб docker, но мне не повезло. Я только начал изучать docker. Есть какие-нибудь мысли?