Django: Хорошая идея динамически генерировать JS?
-
27-09-2019 - |
Вопрос
Когда я пишу свои файлы JS для проекта Django, конечно, я делаю некоторые вызовы AJAX, и на данный момент URL для этих вызовов жестко закодированы (что очень уродливо).
Я думал о том, чтобы иметь Django файлы JS (вместо Apache), поэтому я мог бы воспользоваться тегами шаблона ({% url %}
!!!).
Есть ли причина, почему я не должен этого делать?
Или есть правильный способ сделать это?
(Я могу дать как минимум: он будет потреблять много времени, поправка файлов JS, которые не изменились. Что было бы здорово, это иметь приложение, которое генерирует файлы при перезапуске сервера Django и обслуживает их статически после!)
Решение 2
Я искал глубже в тех приложениях между активами DjangoPackages., узнал, что Django-MediaGenerator Предоставляет эту функцию, даже если она не хорошо документирована: вы можете генерировать файлы JS или CSS в качестве шаблонов Django, а затем служить их статически (они также связаны, и кэширование управляется и т. Д. ... Так что две птицы с одним камнем + Это действительно легко настроить!).
Для того, чтобы файлы JS генерируются как шаблоны Django (после настройки django-mediagenerator
), просто добавьте фильтр:
ROOT_MEDIA_FILTERS = {
'js': 'mediagenerator.filters.template.Template',
}
В ваших настройках.
Другие советы
Я бы пошел на гибридную технику. Подайте большую часть вашего JavaScript статически. Но в вашем шаблоне Django есть <script>
Блок, который определяет различные глобальные переменные, которые генерируются сервером-кодом - url
это хороший пример. Тогда ваши статические JS могут ссылаться на переменные, которые генерируются в динамическом коде.
Динамически генерируя JavaScript на вашем сервере может быть чрезвычайно мощным инструментом, и я пережил как в моем проектах.
В целом вы хотите сохранить максимально возможное, чтобы минимизировать работу, которая будет выполнена на каждом запросе. Это включает в себя максимально возможное кеш браузера, что может стать проблемой в вашем случае.
Что я обычно делаю, это иметь блок в заголовке в моем базовом шаблоне. В шаблонах, которые необходимо выполнить пользовательский JavaScript, который известен только во время выполнения (например, настроен на настроив на основе входа в систему пользователя), я добавляю его в блок. Здесь я могу динамически генерировать JavaScript, который я знаю, не будет кэшировать, поэтому я могу сделать некоторые предположения. Недостатком является более сложность.
Если то, что вам нужно, просто указывайте на URL-адреса или иметь некоторую простую конфигурацию и т. Д., Тогда я бы предложил создать представление, которое вернет файл JavaScript с этими настройками. Вы можете установить правильные заголовки (Etag, Cache-Control, ETC), чтобы браузер будет кэшировать файл для некоторого разумного времени. Когда вы обновляете свой код, убедитесь, что ETAG изменится.
В коде, который необходимо использовать конфигурацию, вам необходимо всегда проверить, что переменная, которую вы ищете, на самом деле определяется иначе вы будем Запустить проблемы, которые трудно отладки, когда по какой-то причине конфигурация JavaScript не загружается правильно.
.Js, которые отправляются в браузер, будут варьироваться. Это может сделать отладку более громоздкими. Может быть, не проблема, но что-то потенциально рассмотреть ...
В настоящее время лучший способ сделать это - использовать Django.js
Вот документ, где они говорят о реверсировании URL: http://djangojs.readtheDocs.org/ru/0.8.1/djangojs.html#Reverse-urls