Django: Стоит ли динамически генерировать JS?

Когда я пишу свои JS-файлы для проекта Django, я, конечно, делаю некоторые вызовы AJAX, и на данный момент URL-адреса для этих вызовов жестко закодированы (что очень некрасиво).

Я думал о том, чтобы файлы JS обслуживались django (вместо Apache), чтобы я мог воспользоваться тегами шаблона ({% url %} !!!).

Есть ли причина, по которой я не должен этого делать?

Или есть правильный способ сделать это?

(Я могу дать хотя бы одно: повторная отправка JS-файлов, которые не изменились, займет много времени. Было бы здорово иметь приложение, которое генерирует файлы при перезапуске сервера django и обслуживает их статически после!)


person sebpiq    schedule 23.11.2010    source источник


Ответы (5)


Я бы выбрал гибридную технику. Подавайте большую часть вашего javascript статически. Но в вашем шаблоне Django есть блок <script>, определяющий различные глобальные переменные, которые генерируются кодом на стороне сервера — хорошим примером является url. Тогда ваш статический JS может ссылаться на переменные, сгенерированные в динамическом коде.

person Daniel Roseman    schedule 23.11.2010
comment
Это то, что я тоже делаю, но недостатком этого является то, что если вы используете что-либо, что принимает пользовательский ввод, вы больше не можете запрещать небезопасные встроенные скрипты в своей политике безопасности контента, поэтому вы уязвимы для межсайтового скриптинга. . Было бы неплохо, если бы была лучшая альтернатива. - person kloddant; 28.03.2017

Я провел более глубокий поиск в этих приложениях управления активами из djangopackages и обнаружил, что django-mediagenerator предоставляет эту функцию, даже если она плохо документирована: вы можете создавать файлы js или css как шаблоны django, а затем обслуживать их статически. (они также связаны, и кеширование управляется и т. д. ... так что двух зайцев одним выстрелом + это действительно легко настроить!).

Чтобы файлы JS генерировались как шаблоны django (после настройки django-mediagenerator), просто добавьте фильтр:

ROOT_MEDIA_FILTERS = {
    'js': 'mediagenerator.filters.template.Template',
}

в ваших настройках.

person sebpiq    schedule 23.11.2010
comment
Сейчас я предпочитаю использовать django-compressor. - person sebpiq; 02.01.2013

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

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

Обычно я делаю блок в заголовке базового шаблона. В шаблонах, которые должны выполнять пользовательский javascript, который известен только во время выполнения (например, настройка на основе вошедшего в систему пользователя), я добавляю его в блок. Здесь я могу динамически генерировать javascript, который, как я знаю, не будет кэшироваться, поэтому я могу сделать некоторые предположения. Недостатком является большая сложность.

Если вам нужно просто указать URL-адреса или иметь простую конфигурацию и т. Д., Я бы предложил создать представление, которое будет возвращать файл Javascript с этими настройками. Вы можете установить правильные заголовки (Etag, Cache-Control и т. д.), чтобы браузер кэшировал файл в течение разумного времени. Когда вы обновите свой код, убедитесь, что Etag изменится.

В коде, который должен использовать конфигурацию, вам нужно всегда проверять, что переменная, которую вы ищете, действительно определена, иначе вы столкнетесь с проблемами, которые трудно отладить, когда по какой-то причине конфигурационный javascript загружается неправильно.

person knutin    schedule 23.11.2010

.js, отправляемый в браузер, может различаться. Это может сделать отладку более громоздкой. Может быть, это не проблема, но что-то потенциально рассмотреть...

person seand    schedule 23.11.2010
comment
Я понятия не имею, как файлы js кэшируются браузером ... Но вам не кажется, что, поскольку он генерируется каждый раз, браузер будет загружать его при каждом отдельном запросе? - person sebpiq; 23.11.2010
comment
это, вероятно, было бы; вам нужно будет посмотреть заголовки ответа кеша http на js - person seand; 23.11.2010

В настоящее время лучший способ сделать это — использовать Django.js.

Вот документ, в котором говорится об изменении URL-адреса: http://djangojs.readthedocs.org/en/0.8.1/djangojs.html#reverse-urls

person Sylvain    schedule 05.12.2013