From 9295617d8e9e672eff45aabc90fec036d4087eaa Mon Sep 17 00:00:00 2001 From: Igor Barcik Date: Tue, 28 Apr 2026 12:36:32 +0200 Subject: [PATCH] feat(core): configure Django/Channels/ASGI settings and URL routing --- core/__init__.py | 1 + core/asgi.py | 17 ++++++++ core/settings.py | 111 +++++++++++++++++++++++++++++++++++++++++++++++ core/urls.py | 13 ++++++ 4 files changed, 142 insertions(+) create mode 100644 core/__init__.py create mode 100644 core/asgi.py create mode 100644 core/settings.py create mode 100644 core/urls.py diff --git a/core/__init__.py b/core/__init__.py new file mode 100644 index 0000000..91db526 --- /dev/null +++ b/core/__init__.py @@ -0,0 +1 @@ +# core/__init__.py diff --git a/core/asgi.py b/core/asgi.py new file mode 100644 index 0000000..a16eb7d --- /dev/null +++ b/core/asgi.py @@ -0,0 +1,17 @@ +import os +import django +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings') +django.setup() + +from channels.routing import ProtocolTypeRouter, URLRouter +from channels.auth import AuthMiddlewareStack +from chat.routing import websocket_urlpatterns + +application = ProtocolTypeRouter({ + 'http': get_asgi_application(), + 'websocket': AuthMiddlewareStack( + URLRouter(websocket_urlpatterns) + ), +}) diff --git a/core/settings.py b/core/settings.py new file mode 100644 index 0000000..fcc4c48 --- /dev/null +++ b/core/settings.py @@ -0,0 +1,111 @@ +import os +from pathlib import Path +from decouple import config + +BASE_DIR = Path(__file__).resolve().parent.parent + +SECRET_KEY = config('SECRET_KEY', default='poc-secret-key') +DEBUG = config('DEBUG', default=True, cast=bool) +ALLOWED_HOSTS = ['*'] + +INSTALLED_APPS = [ + 'daphne', + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'channels', + 'rest_framework', + 'chat', + 'channels_postgres', +] + +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', +] + +ROOT_URLCONF = 'core.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', + ], + }, + }, +] + +ASGI_APPLICATION = 'core.asgi.application' + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': config('DB_NAME', default='discord_db'), + 'USER': config('DB_USER', default='discord_user'), + 'PASSWORD': config('DB_PASSWORD', default='discord_pass'), + 'HOST': config('DB_HOST', default='localhost'), + 'PORT': config('DB_PORT', default='5432'), + }, + 'channels_postgres': { + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': config('DB_NAME', default='discord_db'), + 'USER': config('DB_USER', default='discord_user'), + 'PASSWORD': config('DB_PASSWORD', default='discord_pass'), + 'HOST': config('DB_HOST', default='localhost'), + 'PORT': config('DB_PORT', default='5432'), + } +} + +CHANNEL_LAYERS = { + 'default': { + 'BACKEND': 'channels_postgres.core.PostgresChannelLayer', + 'CONFIG': { + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': config('DB_NAME', default='discord_db'), + 'USER': config('DB_USER', default='discord_user'), + 'PASSWORD': config('DB_PASSWORD', default='discord_pass'), + 'HOST': config('DB_HOST', default='localhost'), + 'PORT': config('DB_PORT', default='5432'), + 'TIME_ZONE': 'UTC', + 'CONN_MAX_AGE': 0, + 'OPTIONS': {}, + 'AUTOCOMMIT': True, + }, + }, +} + +LANGUAGE_CODE = 'en-us' +TIME_ZONE = 'UTC' +USE_I18N = True +USE_TZ = True + +STATIC_URL = '/static/' +STATIC_ROOT = BASE_DIR / 'static' + +MEDIA_URL = '/media/' +MEDIA_ROOT = BASE_DIR / 'media' + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + +LOGIN_URL = '/login/' +LOGIN_REDIRECT_URL = '/' +LOGOUT_REDIRECT_URL = '/login/' + +# PoC: allow large file uploads +DATA_UPLOAD_MAX_MEMORY_SIZE = 52428800 # 50MB +FILE_UPLOAD_MAX_MEMORY_SIZE = 52428800 diff --git a/core/urls.py b/core/urls.py new file mode 100644 index 0000000..985fa08 --- /dev/null +++ b/core/urls.py @@ -0,0 +1,13 @@ +from django.contrib import admin +from django.urls import path, include +from django.conf import settings +from django.conf.urls.static import static + +urlpatterns = [ + path('admin/', admin.site.urls), + path('', include('chat.urls')), +] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ + + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + +handler404 = 'chat.views.handler404' +handler500 = 'chat.views.handler500'