как заставить django обслуживать не статичные c js файлы? - PullRequest
0 голосов
/ 09 января 2020

Мой python бэкэнд-сервер обслуживает приложение как файлы c. В действительности все, что находится внутри каталога sr c, связывается при сборке приложения, однако есть один файл javascript вне каталога sr c в каталоге publi c, который я оставил там, потому что хочу быть нетронутым после сборки. причина, по которой я это сделал, заключается в том, что внутри кода sr c я создаю Workers, а чтобы создать работников, мы должны указать URL рабочего файла. Этот файл называется worker. js, он остается нетронутым после сборки, но после развертывания бэкэнда веб-интерфейс не может получить доступ к URL-адресу /worker.js, поскольку, очевидно, django обслуживает только stati c файлы, поэтому / работник. js не распознан, и вместо него возвращается индекс. html. Как я могу сделать возможным доступ к этому нестати c js файлу?

1 Ответ

0 голосов
/ 09 января 2020

Объяснение того, как работают файлы * stati c:

Разработка

Давайте сначала включим это в ситуацию разработки (django обслуживает ваши файлы stati c с помощью runserver ). STATIC_ ROOT в данном случае не имеет значения.

Django может найти все ваши файлы stati c в следующих местах:

  • Любая папка / static /, расположенная внутри вашей папки. приложения, например, если у вас есть приложение blog, то папка /blog/static/ будет проанализирована.
  • Любая папка, указанная в STATICFILES_DIRS, например, если у вас есть папка assets в главной проект, вы бы добавили его в STATICFILES_DIRS с os.path.join(BASE_DIR, "assets"), где BASE_DIR - это местоположение manage.py .

Что если оба приложения blog а вашему каталогу ресурсов нужен "lo go .png"? Вместо того, чтобы беспокоиться о том, что изображения, js файлы, css файлы имеют уникальные имена, используйте пространство имен. Внутри приложения blog поместите все файлы stati c в /blog/static/blog/, чтобы при их использовании вам нужно было ссылаться на /blog/logo.png, и вы точно знаете, что это будет правильный go .png. Внутри основного проекта поместите файлы в assets/assets (или вместо этого назовите static/assets), чтобы вы могли обратиться к /assets/logo.png для основных ресурсов вашего проекта.

Теперь, если вы установите STATIC_URL = "/static/", это скажет django, что все URL-адреса stati c файлов имеют префикс "/ static /", то есть приведенный выше lo go можно получить с помощью "/ static /assets/logo.png "и" /static/blog/logo.png ". Это необходимо, поскольку позволяет отличать URL-адрес файла stati c от URL-адресов, которые Django направляет к представлениям.

На практике в ваших шаблонах вы будете использовать {% static 'blog/logo.png' %}, чтобы вы не нужно жестко кодировать STATIC_URL везде.

Теперь входит в веб-пакет. Он должен поместить свои ресурсы пакетов в любой из вышеперечисленных каталогов или в свой собственный каталог, который вы также добавляете в STATICFILES_DIRS. Давайте предположим последнее: у нас также есть папка /webpack/webpack/ в нашем проекте, которая определена в STATICFILES_DIRS, поэтому все ресурсы веб-пакета будут доступны через префикс url "/static/webpack/".

рабочий Файл *. 1102 * должен находиться в «assets / assets» и в других ваших скриптах, если вы обращаетесь к нему через url (чтобы получить его с помощью HTTP-запроса), вы должны обращаться к нему через «/ static / assets / worker. js "или с использованием относительного URL" ../assets/worker.js".

Производство

После развертывания вы не обслуживаете ваши stati c файлы с Django больше, но с веб-сервером, например Apache или nginx. Вы настраиваете веб-сервер для распознавания любого запроса, начиная с STATIC_URL ("/ static /"), и извлекаете соответствующий файл из STATIC_ROOT.

Итак, первое, что нужно сделать, это скопировать все файлы stati c вашего приложения django в папку / папку, доступную для вашего веб-сервера. Это расположение вне папки вашего проекта .

Установите STATIC_ROOT = os.path.abspath(os.path.join(os.path.dirname(os.path.dirname(BASE_DIR)), 'static')), что указывает на каталог "stati c" в родительской папке вашего проекта.

Затем запустите python manage.py collectstatic.

Это скопирует все файлы stati c в эту новую папку stati c вне вашего проекта. Вы увидите:

path/to/dir/
   |_ static/
   |   |_ blog/
   |   |   |_ logo.png
   |   |_ assets/
   |   |   |_ logo.png
   |   |   |_ worker.js
   |   |_ webpack/
   |       |_ some_file.js
   |_ django_project/
       |_ manage.py
       |_ main_app/
       |    |_ settings.py
       |_ assets/
       |    |_ assets/
       |        |_ worker.js
       |_ blog/
       |   |_ static/
       |       |_ blog/
       ...

Теперь, когда ваш веб-сервер увидит URL «/static/assets/worker.js», он вернет файл в «path / to / dir / static / assets». / Worker в правильном расположении «путь / к / dir / static / webpack /», потому что именно там их будет искать ваш веб-сервер.

Представьте себе, что теперь вы перемещаете все в сторонний поставщик услуг хранения. Затем вам нужно сделать только две вещи:

  • Установить и настроить серверную часть хранилища для этого провайдера хранения, чтобы Django знал, как читать / записывать файлы там (с collecstatic). Это может включать настройку STATIC_ROOT, например, STATIC_ROOT = https://my-bucket.my-storage-provider.com/static.
  • . Установите STATIC_URL в качестве URL-адреса провайдера хранения, например, STATIC_URL = https://my-bucket.some_cdn.com/. Здесь мы указываем на CDN, который вы настроили, чтобы узнать, откуда можно извлечь файлы.

Вот и все, все продолжает работать.

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