2010-11-23 2 views
7

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

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

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

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

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

ответ

6

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

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

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

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

0

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

+0

Я понятия не имею, как JS файлы кэшируются браузером ... Но разве вы не думаете, что, поскольку он генерируется каждый раз, браузер будет загружать его при каждом отдельном запросе? – sebpiq 2010-11-23 08:13:33

+0

это, вероятно, было бы; вам придется посмотреть заголовки ответа кэша http на js – seand 2010-11-23 08:15:55

4

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

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

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

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

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

11

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

+0

. Это то, что я тоже делаю, но недостатком этого является то, что если вы используете что-либо, что допускает ввод пользователя, вы больше не можете запрещать небезопасные встроенные сценариев в политике безопасности контента, поэтому вы уязвимы для межсайтового скриптинга. Было бы неплохо, если бы была лучшая альтернатива. – kloddant 2017-03-28 20:48:21