Apache не может загрузить статические файлы из определенного приложения Django

У меня есть следующий проект:

```
📦 project_name
 ┣ 📂app_name
 ┃ ┣ 📂migrations (truncated)
 ┃ ┣ 📂static
 ┃ ┃ ┣ 📂css
 ┃ ┃ ┃  ┗📜dashboard.css
 ┃ ┃ ┗  ┗📜password_reset.css
 ┃ ┣ 📂templates (truncated)
 ┃ ┃ ┗ 📂password_reset (truncated)
 ┃ ┣ 📂templatetags (truncated)
 ┃ ┣ 📜__init__.py
 ┃ ┣ 📜asgi.py
 ┃ ┣ 📜constants.py
 ┃ ┣ 📜forms.py
 ┃ ┣ 📜models.py
 ┃ ┣ 📜settings.py
 ┃ ┣ 📜urls.py
 ┃ ┣ 📜views.py
 ┃ ┗ 📜wsgi.py
 ┣ 📂media (truncated)
 ┣ 📂static
 ┃ ┣ 📂css
 ┃ ┃  ┗📜dropzone_style.css
 ┃ ┃  ┗📜login.css
 ┃ ┃  ┗📜password_reset_confirm.css
 ┃ ┣ 📂img
 ┃ ┃  ┗📜csv.png
 ┃ ┃  ┗📜excel.png
 ┃ ┣ 📂js
 ┃ ┃  ┗📜datatables.js
 ┃ ┃  ┗📜dropzone.js
 ┃ ┃  ┗📜sidebar.js
 ┃ ┗ 📜favicon.ico
 ┣ 📂staticfiles
 ┃ ┣ 📂admin (truncated)
 ┃ ┣ 📂css
 ┃ ┃  ┗📜dashboard.css
 ┃ ┃  ┗📜dropzone_style.css
 ┃ ┃  ┗📜login.css
 ┃ ┃  ┗📜sidebar.css
 ┃ ┃  ┗📜style.css
 ┃ ┣ 📂img (empty)
 ┃ ┣ 📂js
 ┃ ┃  ┗📜datatables.js
 ┃ ┃  ┗📜dropzone.js
 ┃ ┃  ┗📜index.js
 ┃ ┃  ┗📜sidebar.js
 ┣ 📂templates (truncated)
 ┣ 📜.gitignore
 ┣ 📜db.json
 ┣ 📜db.sqlite3
 ┗ 📜manage.py
 ┗ 📜requirements.txt
```

У меня есть 2 статические папки: одна в корневой папке и одна внутри папки app.

Эту ошибку я получаю в консоли браузера:

enter image description here

В журналах Apache нет ошибок

Это мой файл apache conf:

<VirtualHost *:80>
    ServerAdmin server_admin@t-mark.co.jp
    ServerName example.com
    DocumentRoot /var/www/example.com/project_name/static

    ErrorLog ${APACHE_LOG_DIR}/app_name_error.log
    CustomLog ${APACHE_LOG_DIR}/app_name__access.log combined

    Header set X-Robots-Tag "noindex, nofollow"

    Alias /static /var/www/example.com/project_name/static/

    <Directory /var/www/example.com/project_name>
        Require all granted
    </Directory>

    <Directory /var/www/example.com/project_name>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>

    WSGIDaemonProcess example.com python-home=/home/user/.env/ca/ python-path=/var/www/example.com/project_name/
    WSGIProcessGroup example.com
    WSGIScriptAlias / /var/www/example.com/project_name/app_name/wsgi.py process-group=example.com

    <Location /var/www/example.com/>
      AuthType Basic
      AuthName "Authorization Required"
      AuthUserFile /var/www/example.com/.htpasswd
      Require valid-user
    </Location>
</VirtualHost>

settings.py (усечено):

ALLOWED_HOSTS = ["example.com"]
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app_name',
    'bootstrap5',
]
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'app_name.urls'
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        '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 = 'app_name.wsgi.application'
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

urls.py:

from django.conf import settings
from django.conf.urls.i18n import i18n_patterns
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include
from django.contrib.auth import views as auth_views
from django.utils.translation import gettext_lazy as _

from . import views


urlpatterns = [
    path('i18n/', include('django.conf.urls.i18n')),
]

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

urlpatterns += i18n_patterns(
    path('', views.index, name='index'),
    path('add_new_task', views.add_new_task, name='add_new_task'),
    path('edit_task/', views.edit_task, name='edit_task'),
    path('delete_task/<int:pk>/', views.delete_task, name='delete_task'),
    path('admin/', admin.site.urls),
    path('accounts/', include('django.contrib.auth.urls')),
    # Password reset links (ref: https://github.com/django/django/blob/master/django/contrib/auth/views.py)
    path('password_change/done/', auth_views.PasswordChangeDoneView.as_view(template_name='password_reset/password_change_done.html'), 
        name='password_change_done'),
    path('password_change/', auth_views.PasswordChangeView.as_view(template_name='password_reset/password_change.html'), 
        name='password_change'),
    path('password_reset/done/', auth_views.PasswordResetCompleteView.as_view(template_name='password_reset/password_reset_done.html'),
     name='password_reset_done'),
    path('reset/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
    path('password_reset/', auth_views.PasswordResetView.as_view(template_name='password_reset/password_reset_form.html'), name='password_reset'),
    path('reset/done/', auth_views.PasswordResetCompleteView.as_view(template_name='password_reset/password_reset_complete.html'),
     name='password_reset_complete'),
)
Вернуться на верх