Django + Apache: не может обслуживать статические файлы - PullRequest
0 голосов
/ 21 сентября 2018

Я думаю, что это распространенная проблема, но ни одно из решений, которые я пробовал, работает.

Код от Apache Conf:

<VirtualHost *:80>
        ServerName xxxx
        ServerAdmin xxxx
        DocumentRoot /home/matousc/apps/iacah

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        Alias /static /home/matousc/apps/iacah/www/static
        <Directory /home/matousc/apps/iacah/www/static>
                Require all granted
                Allow from all
        </Directory>

        <Directory /home/matousc/apps/iacah/app/mainapp>
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>

        WSGIDaemonProcess iacah python-path=/home/matousc/apps/iacah/app  python-home=/home/matousc/apps/appenv
        WSGIProcessGroup iacah
        WSGIScriptAlias / /home/matousc/apps/iacah/app/mainapp/wsgi.py
</VirtualHost>

Я могу получить доступ к странице через Интернет, поэтому Я уверен, что редактирую правильный файл apache conf .Однако статические файлы не загружаются.

Статические файлы не загружаются с ошибкой 403 .Я заметил, что если я изменю строку:

Alias /static/ /home/matousc/apps/iacah/www/static

на (убрал косую черту в конце static:

Alias /static /home/matousc/apps/iacah/www/static

, тогда я получу 404 ошибку . В уроках я видел оба варианта, поэтому меня немного смущает, почему он может играть роль.

Владелец папки /www/: www-data (я использую Ubuntu 18):

drwxrwx--x  3 www-data www-data 4096 Sep 21 10:14 .
drwxr-xr-x  8 matousc  matousc  4096 Sep 21 10:14 ..
drwxrwxrwx 12 www-data www-data 4096 Sep 21 10:14 static

Я использую эту машину как мультихост, и у меня есть еще один статический веб-сайт, который работает (файлы обслуживаются правильно)

<VirtualHost *:80>
    ServerName xxxxx
    ServerAdmin xxxx
    DocumentRoot /home/matousc/apps/placeholder

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <Directory /home/matousc/apps/placeholder>
            Require all granted
            Options +Indexes
            AllowOverride None
     Order allow,deny
            Allow from all
    </Directory>

В DjangoЯ использую (надеюсь, рекомендуется) настройки:

STATIC_URL = "/static/"

if production_machine:
    level_up = os.path.dirname(BASE_DIR)
    STATIC_ROOT = os.path.join(level_up, "www", "static")
    STATICFILES_DIRS = (
        STATIC_ROOT,
    )
else:
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

(production_machine должно быть True).

Любые идеи, что еще я могу попробовать?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Я не совсем уверен, в чем заключалась главная проблема, однако проблема волшебным образом исчезает после следующего часа чистого колдовства .Для других людей, которые застряли в такой же ситуации:

  1. убедитесь, что вы редактируете правильный файл apache conf

  2. как @Du D.Предлагаю убедиться, что статические файлы собраны правильно.Существует множество проблем, которые могут возникнуть (он не захватывает все ваши статические папки и т. Д.).Найдите проблему в своей settings.py

  3. проверке, что вы действительно знаете, кто является пользователем apache на вашей машине

  4. убедитесь, что папкаСобранные статические файлы принадлежат пользователю apache и имеют рекурсивные права доступа rwx!

  5. много играют со слешами в файле Apache Conf.Кажется, что некоторые комбинации использования слэша лучше других.В моем случае /static/ был неправильным (даже если раньше было 403 вместо 404).Мой рабочий пример работает только с /static.

Возможно, я пропустил некоторые шаги, потому что мне повезло, и я не столкнулся со всеми возможными проблемами, поэтому не стесняйтесь редактировать / расширять мой ответ.

0 голосов
/ 21 сентября 2018

Вы запускаете manage.py collectstatic?В производственной среде вам нужно вызвать это для django, чтобы скопировать из кода вашего разработчика в местоположение STATIC_ROOT.

https://docs.djangoproject.com/en/1.11/ref/contrib/staticfiles/#collectstatic

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...