Создание синглетонов в django или любым другим способом для глобального объекта, доступного по запросу

При разработке "виджетов" (объектов, которые - визуализируются - используют некоторые пользовательские файлы javascript), я столкнулся с необходимостью создания своего рода "enabled-scripts-manager" (чтобы избежать двойного включения одного и того же файла JS, когда визуализируется более одного виджета для просмотра).

Моя первая идея состояла в том, чтобы написать собственный контекст рендеринга шаблона, который бы предоставил переменную EXTRA_SCRIPTS в шаблоне. Однако я понятия не имею, где я должен собрать список скриптов во время обработки запроса? Я думаю, что именно здесь мне нужен одиночный объект.

Какие-либо предложения?

1 ответ

Решение

Если вы используете singleton, вы столкнетесь с проблемой безопасности потоков. Например, ваше приложение выполняется в нескольких потоках, один поток обрабатывает один запрос, поэтому ваш глобальный объект должен быть для каждого потока, но синглтон уникален для каждого процесса. Ты можешь использовать threading.local Техника, как описано в этом вопросе. Он предоставит вам объект, который уникален для каждого потока и, следовательно, для каждого запроса.

Однако это не рекомендуется, поэтому не используйте глобальные переменные

Для вашей ситуации с виджетами есть настройки Media в виджетах и ​​формах в Django. https://docs.djangoproject.com/en/1.3/topics/forms/media/

Медиа-объекты также могут быть добавлены вместе. При добавлении двух объектов мультимедиа полученный объект Media содержит объединение мультимедиа из обоих файлов.

Таким образом, вы можете бороться с дубликатами с помощью средств массовой информации. Также вы можете объединить медиа прямо в шаблон

{{ form.media|add:info_form.media|add:discount_form.media }}
Другие вопросы по тегам