From 80774dc8ccfc2fee7a199849c649440078665fef Mon Sep 17 00:00:00 2001 From: Toksi Date: Fri, 14 Nov 2025 14:23:56 +0500 Subject: [PATCH 1/2] =?UTF-8?q?=D0=91=D1=8D=D0=BA=D0=B5=D0=BD=D0=B4=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=20?= =?UTF-8?q?=D0=BD=D0=B0=20Daphne=20+=20=D1=84=D0=B8=D0=BA=D1=81=D1=8B=20?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F/=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/log/middleware.py | 38 +++++++++++++++++++++----------------- files/models.py | 10 ++++++---- procollab/asgi.py | 11 +++++++---- scripts/startup.sh | 4 +++- 4 files changed, 37 insertions(+), 26 deletions(-) diff --git a/core/log/middleware.py b/core/log/middleware.py index 55462ef9..f20e7951 100644 --- a/core/log/middleware.py +++ b/core/log/middleware.py @@ -1,30 +1,34 @@ -from loguru import logger -from django.conf import settings +import copy import logging + +from django.conf import settings +from loguru import logger + from core.log.utils import InterceptHandler +def _add_logger_handler(path: str, level: str) -> None: + """ + Attach loguru handler, falling back to synchronous mode if multiprocessing + queues are not permitted (e.g. limited dev envs). + """ + kwargs = copy.deepcopy(settings.LOGURU_LOGGING) + try: + logger.add(path, level=level, **kwargs) + except PermissionError: + kwargs.pop("enqueue", None) + logger.add(path, level=level, **kwargs) + + class CustomLoguruMiddleware: def __init__(self, get_response): self.get_response = get_response logging.basicConfig(handlers=[InterceptHandler()], level=0, force=True) if settings.DEBUG: - logger.add( - f"{settings.BASE_DIR}/log/debug.log", - level="DEBUG", - **settings.LOGURU_LOGGING, - ) - logger.add( - f"{settings.BASE_DIR}/log/info.log", - level="INFO", - **settings.LOGURU_LOGGING, - ) - logger.add( - f"{settings.BASE_DIR}/log/warning.log", - level="WARNING", - **settings.LOGURU_LOGGING, - ) + _add_logger_handler(f"{settings.BASE_DIR}/log/debug.log", "DEBUG") + _add_logger_handler(f"{settings.BASE_DIR}/log/info.log", "INFO") + _add_logger_handler(f"{settings.BASE_DIR}/log/warning.log", "WARNING") def __call__(self, request): response = self.get_response(request) diff --git a/files/models.py b/files/models.py index 7c43149c..ea7393cf 100644 --- a/files/models.py +++ b/files/models.py @@ -1,10 +1,8 @@ import reprlib -from django.contrib.auth import get_user_model +from django.conf import settings from django.db import models -User = get_user_model() - class UserFile(models.Model): """ @@ -20,7 +18,11 @@ class UserFile(models.Model): """ link = models.URLField(primary_key=True, null=False) - user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True) + user = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.SET_NULL, + null=True, + ) datetime_uploaded = models.DateTimeField(auto_now_add=True) name = models.TextField(blank=False, default="file") extension = models.TextField(blank=True, default="") diff --git a/procollab/asgi.py b/procollab/asgi.py index 5ba84539..13f70e69 100644 --- a/procollab/asgi.py +++ b/procollab/asgi.py @@ -1,16 +1,19 @@ import os -import chats.routing from channels.routing import ProtocolTypeRouter, URLRouter from django.core.asgi import get_asgi_application -from chats.middleware import TokenAuthMiddleware - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "procollab.settings") +# Ensure Django app registry is loaded before importing project routes. +django_asgi_app = get_asgi_application() + +import chats.routing # noqa: E402 +from chats.middleware import TokenAuthMiddleware # noqa: E402 + application = ProtocolTypeRouter( { - "http": get_asgi_application(), + "http": django_asgi_app, "websocket": TokenAuthMiddleware(URLRouter(chats.routing.websocket_urlpatterns)), } ) diff --git a/scripts/startup.sh b/scripts/startup.sh index 3b4eef7a..6c35ebf8 100644 --- a/scripts/startup.sh +++ b/scripts/startup.sh @@ -2,4 +2,6 @@ python manage.py migrate python manage.py collectstatic --no-input -python manage.py runserver 0.0.0.0:8000 \ No newline at end of file + +# Use Daphne ASGI server instead of Django's dev server. +exec daphne -b 0.0.0.0 -p 8000 procollab.asgi:application From a284a60083d8c24f8f18339590255d04f89c8f7f Mon Sep 17 00:00:00 2001 From: Toksi Date: Fri, 14 Nov 2025 14:27:25 +0500 Subject: [PATCH 2/2] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20make=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=B0?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 5832d918..e9355d90 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,7 @@ up: docker compose -f docker-compose.yml up -d down: - docker compose -f docker-compose.yml down \ No newline at end of file + docker compose -f docker-compose.yml down + +run-local: + poetry run daphne -b 0.0.0.0 -p 8000 procollab.asgi:application