Создание синглетонов в 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 }}