Почему Django не загружает встроенные статические файлы? - PullRequest
0 голосов
/ 16 октября 2018

У меня установлен экземпляр Django на сервере Apache, работающем через uWSGI hunky dory.На моей локальной машине все выглядит отлично, когда я использую python manage.py runserver.К сожалению, в ту минуту, когда я загрузил файлы на свой предварительно подготовленный рабочий сервер, он отказался загружать все встроенные статические файлы Django, возвращая 404, и я понятия не имею, почему ...

URL, которыйзапрашиваемый список указан как www.mysite.com/static/admin/css/fonts.css и аналогичен для административного бэкэнда (css/base.css, css/dashboard.css и css/responsive.css).Сначала я подумал, что с пакетами что-то не так, поэтому принудительно переустановил Django, но не пошел.Все еще не загружается ...

Вот мой конфиг uWSGI .ini:

[uwsgi]
chdir = /path/to/top/level/mysite
module = mysite.wsgi:application
env = DJANGO_SETTINGS_MODULE=mysite.settings
master = true
pidfile = /path/to/project.pid
socket = 127.0.0.1:49152
; Dont use UNIX sockets as it confuses the proxy and alters the request 
: URL's. Current Apache version cant handle it.
; socket=/var/run/swerth_django.sock
processes = 5
harakiri = 20
post-buffering = 1
max-requests = 5000
vacuum = true
home = /path/to/top/level/Virtualenv/directory
daemonize = /path/to/uWSGI.log
env = LANG=en_US.UTF-8
enable-threads = true

И я включил статический корень и URL следующим образом (комментарии были для моего собственного понимания):

#The URL of which the static files in STATIC_ROOT directory are served
STATIC_URL = '/static/'

#The absolute path to the directory where ./manage.py collectstatic
# will collect static files for deployment.
STATIC_ROOT = '/home/swerth/public_html/swerth/static'

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

Редактировать:

Хорошо, поэтому я провел небольшое исследование и смог немного его сузить (Спасибо @ Alasdair для указания на определенную страницу в Django документах).Кажется, я могу просто запустить python manage.py collectstatic и он импортирует все нужные мне файлы в www.mysite.com/static.Однако по какой-то причине django dosnt, похоже, «видит» файлы, поскольку они не отображаются в браузере (404 не найдено).

В свете этого я предполагаю, что моя конфигурация в settings.py?

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/

#The URL of which the static files in STATIC_ROOT directory are 
#served
STATIC_URL = '/static/'

#The absolute path to the directory where ./manage.py collectstatic
# will collect static files for deployment.
STATIC_ROOT = os.path.join(BASE_DIR, "static")

STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]

Мой Apache настроен в качестве обратного прокси-сервера с использованием следующей конфигурации:

RewriteEngine off
ProxyPreserveHost on
ProxyPass "/"  "uwsgi://127.0.0.1:49152/"
ProxyPassReverse "/" "uwsgi://127.0.0.1:49152/"

Я делаю это неправильно или что-то в этом роде?(PS Я пытаюсь избежать необходимости редактировать ссылку на статический файл HTML-файлов, поскольку я действительно хотел бы знать, ЧТО я делаю неправильно, чтобы это не повторилось, поскольку Django должен быть в состоянии обслуживать прямо с www.mysite.com/static)

Правка раунда 2:

Хорошо, поэтому я сделал так, как предлагал, и попытался настроить мой прокси-сервер на исключение статического каталога и просто обслуживать файлы в обычном режиме, а также добавил псевдоним для сопоставления URL-адреса сфактический каталог, но он все еще не работает должным образом.Кажется, он полностью игнорирует мое ProxyPass исключение и отправляет его в Django, хотя я включил его выше менее специфического правила?Интересная проблема, когда я указываю /admin/ вместо просто / для менее специфичного ProxyPass, он только передает этот URL-адрес Django, однако Django внезапно поднимает 404 для /admin/.Кроме того, я получаю 403, запрещенный для статических файлов, которые я пытался обслуживать?!?!Мой текущий .conf выглядит так:

Alias /static/ /home/swerth/public_html/swerth/static/

<Directory /home/swerth/public_html/swerth/static/>
    Require all granted
</Directory>

<Directory /home/swerth/public_html/swerth/swerth/>
<Files wsgi.py>
    Require all granted
</Files>
</Directory>

ProxyPreserveHost on
ProxyPass /whm-server-status/ !
ProxyPass /static/ !
ProxyPass /  uwsgi://127.0.0.1:49152/
ProxyPassReverse / uwsgi://127.0.0.1:49152/

1 Ответ

0 голосов
/ 17 октября 2018

Вероятно, это потому, что вы не настроили Apache для обслуживания статических файлов.Попробуйте выполнить следующее

  1. Перейдите в папку «статических» файлов и получите абсолютный путь к этой папке, используя pwd.Похоже, /home/swerth/public_html/swerth/static в вашем случае.Также убедитесь, что у пользователя, запускающего процесс Apache httpd, есть доступ на чтение к статической папке.
  2. Теперь отредактируйте ваш VirtualHost, выполнив

    sudo nano /etc/apache2/sites-available/000-default.confsudo nano /etc/apache2/sites-available/000-default.conf Замените 000-default.conf насвой собственный, если вы используете другой файл конфигурации.

  3. Добавьте следующее в блок виртуальных хостов:

<VirtualHost *:80>
  . . .

  Alias /static /home/swerth/public_html/swerth/static
  <Directory /home/swerth/public_html/swerth/static>
      Require all granted
  </Directory>

  . . .
</VirtualHost>

Также убедитесь, что вы поместили это над uwsgi <Directory> часть 4. Перезапустите apache, выполнив sudo systemctl restart apache2

This хорошее руководство по развертыванию приложения Django в рабочей среде.

Надеюсь, это поможет.

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