Ошибка Django 403 для статических файлов на виртуальном хостинге с использованием passenger_wsgi
Я пытаюсь запустить свое приложение Django на виртуальном хостинге, используя passenger_wsgi (следуя инструкции хостинг-провайдера).
Поскольку приложение предназначено для основного домена, я установил его, используя следующее расположение папок:
public_html
django
static
css
js
images
SMC_website
templates
В файле settings.py у меня есть:
STATIC_URL = 'static/'
STATICFILES_DIRS = [
'/home/xxxxxx/public_html/django/static/',
'/home/xxxxxx/public_html/django/static/css',
'/home/xxxxxx/public_html/django/static/js',
'/home/xxxxxx/public_html/django/static/images',
]
В urls.py у меня есть:
urlpatterns = [
path('admin/', admin.site.urls),
re_path(r"^$", views.index, name="Home Page"),
]
urlpatterns += static(settings.STATIC_URL,
document_root=os.path.join(settings.BASE_DIR, 'static'))
Когда я пробую "static(settings.STATIC_URL,document_root=os.path.join(settings.BASE_DIR, 'static'))" в оболочке django manage.py, я получаю пустой список ([]). Не уверен, почему, и является ли это причиной моей проблемы.
Приложение запускается, извлекает данные из базы данных, но выдает ошибку 403 для любого содержимого, доступного из статических папок (css, js или изображения).
У меня есть эти разрешения на папки:
drwxr-x--- 2 xxxxxx xxxxxx 4096 Dec 17 18:30 css
drwxr-x--- 8 xxxxxx xxxxxx 4096 Dec 17 18:30 images
drwxr-x--- 3 xxxxxx xxxxxx 4096 Dec 17 18:30 js
drwxr-xr-x 5 xxxxxx xxxxxx 4096 Dec 11 14:24 SMC_website
drwxr-xr-x 3 xxxxxx xxxxxx 4096 Dec 11 14:24 logs
-rw-r--r-- 1 xxxxxx xxxxxx 689 Dec 11 14:24 manage.py
-rw-r--r-- 1 xxxxxx xxxxxx 1442 Dec 17 18:08 passenger_wsgi.py
-rw-r--r-- 1 xxxxxx xxxxxx 245760 Dec 11 14:24 smcDB.sqlite3
drwxr-xr-x 10 xxxxxx xxxxxx 4096 Dec 11 14:31 static
the xxxxxx is the User Name and it is the same as the folder in settings.py above
В отладчике браузера я вижу ожидаемые урлы для статического содержимого, например:
<script type="text/javascript" src="https://southmetrochorale.org/static/js/smc.js"></script>
Есть предложение, как решить эту ошибку 403?
Итак, сначала вам нужно указать вашу STATIC_ROOT
внутри settings.py
. Это объявляет папку, из которой вы хотите обслуживать ваши статические файлы.
Затем вы выполняете команду python manage.py collectstatic
. Это вытащит все ваши статические файлы из вашей STATICFILES_DIRS
и организует их в папке, которую вы объявили в STATIC_ROOT
ранее.
Эта часть:
urlpatterns += static(settings.STATIC_URL,
document_root=os.path.join(settings.BASE_DIR, 'static'))
работает только внутри django-testserver с DEBUG=True
.
Проблема, с которой вы сталкиваетесь, - это производство против разработки.
Для дальнейшего чтения рекомендую Как развернуть статические файлы в производстве
Я нашел решение этой проблемы. Поскольку приложение Django находится в папке (django) в основном расположении домена (public_html) -> public_html/django, а папка static находится в public_html/django/static, мне нужно было использовать: STATIC_URL = "django/static/"
Все в порядке, все статические файлы теперь обслуживаются.