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 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