diff --git a/chat/templates/chat/base.html b/chat/templates/chat/base.html index 5650fff..e6ab360 100644 --- a/chat/templates/chat/base.html +++ b/chat/templates/chat/base.html @@ -324,8 +324,12 @@ +
{% block body %}{% endblock %} +
+ +
v2026.05.24-b
@@ -341,7 +345,7 @@ - diff --git a/core/urls.py b/core/urls.py index 985fa08..1ef75d5 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,13 +1,43 @@ from django.contrib import admin -from django.urls import path, include +from django.urls import path, re_path, include from django.conf import settings from django.conf.urls.static import static +from django.views.static import serve as static_serve +from django.http import FileResponse, Http404 +import os +from urllib.parse import unquote + + +def serve_media(request, path): + """Serve media files — works under Daphne/ASGI where static() does not.""" + # URL-decode the path (handles %20 for spaces, etc.) + decoded_path = unquote(path) + file_path = os.path.join(settings.MEDIA_ROOT, decoded_path) + + if os.path.isfile(file_path): + return FileResponse(open(file_path, 'rb')) + + # Fallback: try the raw (non-decoded) path + raw_path = os.path.join(settings.MEDIA_ROOT, path) + if os.path.isfile(raw_path): + return FileResponse(open(raw_path, 'rb')) + + print(f"[MEDIA 404] Requested: {path}") + print(f"[MEDIA 404] Decoded: {decoded_path}") + print(f"[MEDIA 404] Full path: {file_path}") + print(f"[MEDIA 404] Exists: {os.path.exists(file_path)}") + print(f"[MEDIA 404] Dir listing: {os.listdir(os.path.dirname(file_path)) if os.path.isdir(os.path.dirname(file_path)) else 'DIR NOT FOUND'}") + raise Http404(f"Media file not found: {decoded_path}") + urlpatterns = [ path('admin/', admin.site.urls), + # Serve media files explicitly — needed because Daphne (ASGI) does not + # honour the static() helper the way Django's runserver does. + # Must be BEFORE the catch-all chat.urls include. + re_path(r'^media/(?P.*)$', serve_media), path('', include('chat.urls')), -] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ - + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) +] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) handler404 = 'chat.views.handler404' handler500 = 'chat.views.handler500'