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.
Эту ошибку я получаю в консоли браузера:
В журналах 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'),
)