Джанго: Это хорошая идея для динамического генерирования JS? - PullRequest
9 голосов
/ 23 ноября 2010

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

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

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

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

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

Ответы [ 5 ]

11 голосов
/ 23 ноября 2010

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

6 голосов
/ 23 ноября 2010

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

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

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

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

4 голосов
/ 23 ноября 2010

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

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

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

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

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

0 голосов
/ 05 декабря 2013

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

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

0 голосов
/ 23 ноября 2010

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

...