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

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

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

Есть предложения?

1 Ответ

3 голосов
/ 03 января 2012

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

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

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

Объекты мультимедиа также можно добавлять вместе. При добавлении двух объектов мультимедиа результирующий объект мультимедиа содержит объединение мультимедиа из обоих файлов.

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

{{ form.media|add:info_form.media|add:discount_form.media }}
...